备份与恢复:
- 备份使得数据库的中的数据更加高效和安全。
备份/恢复策略:
进行备份或恢复时需要考虑的一些因素:
- 确定要备份的表的存储引擎是事务性还是非事务性,两种不同存储引擎备份方式在处理数据一致性方面是不太一样的。
- 确实使用全量备份还是增量备份。全备份的优点是备份保持最新备份,恢复的时候可以花费更少的时间;缺点是如果数据量过大,将花费很多的时间,并对系统造成较长时间的压力。增量备份则恰恰相反,只需备份每天的增量日志,备份时间少,对负载压力下;缺点是恢复的时候需要全备份加上次备份到故障前的所有日志,恢复时间会长些。
- 可以考虑采取复制的方法来做异地备份,但复制不能代替备份,它对数据库的误操作也是无能为力。
- 要定期做备份,备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行。
- 确保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选项:
第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'。
不吝指正。
来源:oschina
链接:https://my.oschina.net/u/222173/blog/324603