1.
mysqldump
2.
mysqlhotcopy
3.mysqlsnapshot
4.ibbackup
联机备份
.VS.
脱机备份
联机备份通常使用在不能接受数据库停机的情况下,一般来说,脱机备份速度快,并且发生错误的几率少,我们不用担心数据库正在执行事务,锁表等容易发生一致性问题的发生。如果你幸运的可以停下数据库或者有一个主从方式的数据库,请使用脱机方式备份。
Data
Dump
vs
Raw
backups
Data
dump
输出一系列SQL
语句序列,可以在后来用来重新创建数据库的结构并恢复数据。mysqldump
是这个领域的首选工具,他可以用在任意类型的表上面,无论是本地的还是网络的。当然,由于要产生很多额外的SQL语句,导出结果将是一个很大的文件并且占用很多CPU资源,最重要的是,当数据恢复后需要一次完全的索引重建。
更有效率的方法是是对MySQL数据库的物理文件做一次快照(snapshot)。因为我们跳过了很多转化步骤,因此处理起来比较高效。
做一个MyISM数据表的备份只要拷贝磁盘上数据文件和索引文件。对InnoDB,需要备份对应表空间和关联的事务日志。
mysqldump
/
mysqlhotcopy
/
mysqlsnapshot
/
ibbackup
mysqldump
-
(online,
dump)
-
最一般的工具,他会通过锁表的方式从一个联机数据库中做数据导出并写到指定的文件中(磁盘或网络上)。他只适合小的数据库。
#
typical
mysql
dump
backup
and
restore
usage
mysqldump
-u
root
-pPassword
-x
–all-databases
>
db_dump.sql
mysql
-u
root
-pPassword
<
db_dump.sql
#
dump
into
‘backup’
folder
(local
machine),
into
two
text
files
<data,
table_structure>
mysqldump
-T
backup
–fields-terminated-by=’,’
database-name
-u
root
-pPassword
#
compress
the
dumped
data
on
the
fly
mysqldump
-u
root
-pPassword
–all-databases
|
bzip2
-c
>
db_dump.bz2
mysqlhotcopy
-
(online,
raw)
将对由
ISAM或MyISAM
表构成的数据库做一个完全的物理备份。他的 *** 作方式:对所有表获取一个只读锁=>做文件拷贝=>释放锁。
#
perform
an
online
backup
into
/backup/location
mysqlhotcopy
-u
root
-p
password
database_name
/backup/location
mysqlsnapshot
-
(online,
raw)
一个非常好的工具用来在联机方式下获得MySQL数据库的一个快照。可以配置它来压缩数据,并/或
为每一个数据库提供一个分离的tar文件。
不过他只适合
MyISAM
类型数据库。
#
save
a
full
database
snapshot
of
an
online
database
into
/backup/location
mysqlsnapshot
-u
root
-pPassword
-s
/backup/location
#
restore
a
snapshot
tar
-xvf
/backup/location/db.tar
ibbackup
-
(online,
raw)
可以对使用InnoDB和MyISAM表的任何数据库做联机备份。是一个很好的工具就是要收费.当然如果你是一个InnoDB的用户,还是值得花钱购买的。
#
perform
online
backup
of
MyISAM
/
InnoDB
tables
ibbackup
/etc/my.cnf
/etc/ibbackup.cnf
#
restore
recent
backup
(as
configured
in
ibbackup.cnf)
ibbackup
–restore
/etc/ibbackup.cnf
cp,
scp,
nc
-
(offline,
raw)
如果你可以停下数据库,则可以使用这几个工具直接拷贝数据库目录下的文件。是获取数据库快照的最安全方法。
select (*) from tb_name where create_time >xxx
最终得知是因为这个表数据行数已经超过 一千万了,然后create_time字段又没有索引 。
那解决办法肯定是加索引喽。
但是这个表是一直在线上运行,很重要和业务部分。如果给千万级的大表在线加索引 ,肯定会卡死。
然后就搜罗了一大筐解决方案,比如 在线无锁加索引使用
ALTER TABLE tbl_name ADD PRIMARY (column), ALGORITHM=INPLACE, LOCK=NONE
后来才发现,这个特性是 Mysql 5.6 以后才支持,然而我们的mysql用的是5.5版本
最后在 《高性能Mysql》一书中看到,可在通过 “影子拷贝”来解决,
就是 先创建一张和源表无关的新表,然后通过重命名和删表 *** 作交换两张表;
当给新表加完索引后,最上面那条查询直接就是0.0002s
场景:在给一张有几万条记录的表添加索引时,进度非常慢,导致其它查询无法进行
处理方式:
使用Navicat的命令行模式,执行以下命令:
show processlist
这时会看到有哪些线程正在执行,也可以查看锁表的线程。你会发现alter table * add key ****那个线程状态是Waiting for table metadata lock,后面有个这个表的所有 *** 作都是这个状态,很明显是这条加索引的语句把表给锁了。
查看线程ID,执行
kill 线程ID
这样被锁住的表就能立即被使用了。
由此得出一个结论,当一张表数据量很大时,不要轻易添加索引,会导致表被锁死!如果非要添加,那么应该先把数据表进行备份,然后进行空表添加索引。
只能通过ALTER TABLE不能create index
参数说明:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)