MySQL管理与优化(20):备份与恢复

备份与恢复:

  • 备份使得数据库的中的数据更加高效安全

备份/恢复策略:

进行备份或恢复时需要考虑的一些因素:

  • 确定要备份的表的存储引擎是事务性还是非事务性,两种不同存储引擎备份方式在处理数据一致性方面是不太一样的。
  • 确实使用全量备份还是增量备份。全备份的优点是备份保持最新备份,恢复的时候可以花费更少的时间;缺点是如果数据量过大,将花费很多的时间,并对系统造成较长时间的压力。增量备份则恰恰相反,只需备份每天的增量日志,备份时间少,对负载压力下;缺点是恢复的时候需要全备份加上次备份到故障前的所有日志,恢复时间会长些。
  • 可以考虑采取复制的方法来做异地备份,但复制不能代替备份,它对数据库的误操作也是无能为力。
  • 定期做备份,备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行。
  • 确保MySQL打开log-bin选项,有了BINLOG,MySQL才可以在必要的时候做完整恢复,或基于时间点的恢复,或基于位置的恢复。
  • 要经常做备份恢复测试,确保备份是有效的,并且是可以恢复的。

逻辑备份和恢复:

  • 逻辑备份可以针对不同的存储引擎,而使用相同的方法来备份;而物理备份对于不同的存储引擎会有不同的方法。

备份:

  • MySQL中的逻辑备份将数据库中的数据备份为一个文本文件,备份的文件可以查看和编辑。
  • 我们可以是使用mysqldump工具实现备份,如:
-- 备份所有数据库
mysqldump -uroot -p --all-database > all.sql

-- 备份数据库test
mysqldump -uroot -p test > test.sql

-- 备份数据库test下的表emp
mysqldump -uroot -p test emp > test_emp.sql

-- 备份数据库test下的表emp, dept
mysqldump -uroot -p test emp dept > test_emp_dept.sql

-- mysqldump --help可查看更多选项
  • 为了保证数据备份的一致性,对于MyISAM表备份时需要加上-l参数,对于InnoDB可采用--single-transaction选项。

完全恢复:

  • 同样,我们可以使用mysqldump实现简单的恢复:
-- 恢复某个数据库
mysql -uroot -p db_name < bakfile

-- 上面的恢复可能不完整,还需要将备份后执行的日志进行重做
mysqlbinlog binlog-file | mysql -uroot -p db_name

基于时间点恢复:

  • MySQL恢复中分为完全恢复非完全恢复,非完全恢复分为基于时间点的恢复和基于位置的恢复。
  • 基于时间点的恢复:
-- 若上午10点发生了误操作,可以用下面的语句进行恢复
mysqlbinlog --stop-date="2014-10-06 9:59:59" bin_log_file | mysql -uroot -p****

-- 跳过10点的误操作,再恢复
mysqlbinlog --start-date="2014-10-06 10:00:01" bin_log_file | mysql -uroot -p****

基于位置恢复:

-- 保存某时间段内的日志
mysqlbinlog --start-date="2014-10-06 12:10:20" --stop-date="2014-10-06 12:15:00" bin_log_file > temp_file

-- 越过某些位置的日志,进行恢复,如跳过1000~2000位置的日志
mysqlbinlog --stop-position="1000" bin_log_file | mysql -uroot -p****
mysqlbinlog --start-position="2000" bin_log_file | mysql -uroot -p****

物理备份和恢复:

  • 物理备份又分为冷备份热备份两种,和逻辑备份相比,优点是备份和恢复的速度更快。

冷备份:

  • 停掉MySQL服务,在操作系统级别恢复MySQL的数据文件;重启MySQL服务,使用mysqlbinlog工具恢复备份以来所有的BINLOG。

热备份:

  • 热备份需要针对不同存储引擎,主要是MyISAM和InnoDB。
  • MyISAM存储引擎:
-- 1. 使用mysqlhotcopy工具
mysqlhotcopy -u root -p **** db_name /path/to/new_directory

-- 2. 手动锁表复制
flush tables for read;
-- 复制数据文件到备份目录
  • InnoDB存储引擎:

可以参考收费工具ibbackup,http://dev.mysql.com/doc/mysql-enterprise-backup/3.7/en/ihb-meb-compatibility.html

表的导入导出:

导出:

  • 有时我们需要对数据库表进行导出,以:

        1. 作为Excel显示;

        2. 为了节省备份空间

        3. 为了快速加载数据,LOAD DATA的加载速度比普通的SQL加载快20倍以上。

  • 可以有两种办法来实现:
-- 使用SELECT ... INTO OUTFILE ...
SELECT * FROM table_name INTO OUTFILE ‘file_name‘ [option];

其中option选项:


NOTE: 
SELECT ... INTO OUTFILE ...产生的输出文件如果已存在,将会创建失败,不会覆盖原文件。

第2种方法是用mysqldump导出:

mysqldump -u username -T target_dir db_name table_name [option]
其中option选项:

导入:

  • 使用LOAD DATA INFILE:
LOAD DATA [LOCAL] INFILE ‘file_name‘ INTO TABLE table_name [option]
其中option选项如下:

  • 使用mysqlimport:
mysqlimport -u root -p*** [--LOCAL] db_name file_name [option]
其中option:

NOTE: 如果导入和导出是跨平台操作的(Windows和Linux),那么要注意设置参数line-terminated-by,Windows上设置为line-terminated-by=‘\r\n‘,Linux上设置line-terminated-by=‘\n‘。

不吝指正。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。