MySQL的备份与恢复

备份
备份分为完全备份和增量备份。
完全备份有两种方式,一种是备份所有的数据库文件,适合比较大的数据库,另一种是将数据库全部dump出来,适合数据比较少的情况。
对于第一种方法,各种引擎的方式差不多,步骤如下:
1. flush tables with read lock 加读锁保持数据的一致性
2. flush logs或者show master status记下二进制日志的位置方便增量备份
3. 建立快照或者直接拷贝数据库文件
4. unlock tables
3中如果建立快照还需要下面两步:
5. 拷贝数据库文件
6. 删除快照
对于MyISAM表还可以使用mysqlhotcopy,它也是直接拷贝表文件。由于脚本自己会锁表所以步骤比较少,命令为:
mysqlhotcopy -h hostname -u username --flushlog db_name /bak/path
需要注意的是mysqlhotcopy(5.0.37)和最新的DBI(1.54)不兼容,可以在842行后加上一行
s/.*$quote//g;
解决。
注意用这种方法,如果不是用快照,那么当数据库很大的时候,锁表的时间比较长,这段时间内更新操作不能进行。

对于第二种方法,可以使用mysqldump,当然也可以用select into,不过用这个命令比较麻烦。
如果是innodb的表,那么使用参数--single-transaction可以保持数据库的一致性,而锁表的时间很短。
如果不是innodb表,那么就要使用--lock-tables或者--lock-all-tables,这样在整个导出过程中加读锁,期间更新操作不 能进行,当数据库比较大的时候需要注意。--lock-tables是按数据库加锁,不能保证全部数据库的一致性,--lock-all-tables是 给所有数据库的所有表加锁。
命令为:
mysqldump --lock-all-tables --flush-logs --master-data=2 --all-database > db.sql

mysqldump --single-transaction --flush-logs --master-data=2 --database db_name> db.sql

增量备份则是定期备份二进制日志,备份前使用 flush logs 刷新日志。如果之前完全备份使用了flush命令或选项,那么增加备份从完全备份之后新生成的日志开始,否则从完全备份时在使用的日志开始。


恢复
恢复步骤比较简单。
1. 如果是备份的数据文件,那么拷回数据目录。如果是导出的,用 mysql < bak.sql 导入
2. 导入完全备份之后增量备份的二进制日志,命令为 mysqlbinlog mysql-bin.xxxx | mysql。
如果完全备份时没有刷新日志可能还需要用--start-datetime或--start-position指定日志的起始位置。

你可能感兴趣的:(sql,mysql,脚本)