一、Mysql常用备份方式
Mysql的备份方法可以根据备份手段、备份的数据范围及备份时数据服务是否在线等来划分,如:根据备份的数据集的范围可以划分为全量备份、增量备份、差异备份;根据备份的方法可以划分为物理备份和逻辑备份;根据备份时数据服务是否在线可以划分为热备份、冷备份和温备份。其中各种备份方式的解释如下:
物理备份:是指备份时直接复制备份数据库的数据文件。
逻辑备份:是指备份时,是使用备份工具从数据库导出数据库的一个或多个备份文件。
事务日志备份:事务日志是一个单独的文件,它记录数据库的改变,备份的时候只需要复制自上次备份以来对数据库所做的改变,所以只需要很少的时间。为了使数据库具有鲁棒性,推荐每小时甚至更频繁的备份事务日志。
完全备份:是指将整个数据库内容做完整的备份。
增量备份:是指仅备份自上一次完全备份或增量备份之后所增加的数据内容。
差异备份:是指仅备份自上一个完全备份之后所增加的内容。
热备份:是指在不停用数据库所提供的数据服务的读写操作下所做的备份。
冷备份:是指在停用数据库所提供的数据服务的读写操作下进行备份。
温备份:是指在停用数据库的写入操作,但不停用读取操作的情况下进行备份。
在进行数据库备份的时候可结合上述的各种方法来进行Mysql数据库的备份,如:全量+差异备份,全量+增量备份等。在进行数据库备份时综合考虑下述事项:
1、备份需要锁定数据库资源多长时间?(可能影响业务)
2、备份所需要的时长。
3、备份时服务器的负载情况如何?
4、备份后,进行数据恢复所需要的时长?
二、Mysql的备份工具
1、mysqldump
Mysqldump是mysql自带的备份工具,目录在bin目录下面:/usr/local/mysql/bin/mysqldump,支持基于innodb的热备份。但是由于是逻辑备份,所以速度不是很快,适合备份数据比较小的场景。Mysqldump完全备份+二进制日志可以实现基于时间点的恢复。
对myisam存储引擎的表,只能使用温备份,这个时候要防止数据的写入,所以先加上读锁。这个时候也可以进入数据库手动加读锁,不过这样比较麻烦,可以在mysqldump工具中直接有一个加锁的选择,就是 --lock-all-tables ,例如:
mysqldump --databases test --lock-all-tables --flush-logs > /tmp/backup_test_`date+%F-%H-%M`.sql;`
如果是备份单张表,直接在库名字test后面加上表名字即可。
注意,恢复的时候记得关闭二进制日志:mysql> set sql_log_bin=0;
因为这是基于逻辑备份方式,所以执行sql会插入数据,会记录到二进制日志里面去,因为这是恢复,所以插入的二进制日志基本没有啥意思,可以关闭掉,缩短恢复时间。
Mysqldump工具的使用语法为:
mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
其常用选项为有:
--all-databases:备份数据库中的所有表;
-l,--lock-tables:开始导出前,锁定所有表。用READ LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。
-x,--lock-all-tables:提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。
--single-transaction:用于在备份开始时设置事务隔离状态并使用一致性快照开始事务,而后马上unlock tables,然后执行导出,导出过程不影响其它事务或业务连接,但只支持类似innodb多版本特性的引擎;
--master-data[=NUM]:该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。
--no-data, -d:不导出任何数据,只导出数据库表结构;
-p,--password:连接备份数据库的密码;
-u:连接数据库的备份账号;
-R:备份存储过程;
-p,--port:指定数据库的端口号;
--flush-logs:锁定表完成后,即进行日志刷新操作;
--ignore-table:不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump工具的备份示例:
#全量备份所有数据(MyISAM)
mysqldump --lock-all-tables --flush-logs --master-data=2 -uroot --all-databases > /data/mysqldump/mysqldumpnew1.sql
#如果是InnoDB表的话,将--lock-all-tables换成--single-transaction即可
2、xtrabackup工具
xtrabackup 对于MyISAM只支持温备,不支持增量备份;支持innodb的物理热备份,支持完全备份,增量备份,而且速度非常快,支持innodb存储引起的数据在不同数据库之间迁移,支持复制模式下的从机备份恢复备份恢复,为了让xtrabackup支持更多的功能扩展,可以设立独立表空间,打开 innodb_file_per_table功能,启用之后可以支持单独的表备份。xtrabackup可以实现完全备份,增量备份,以及部分备份,其支持在线热备与恢复,在大数据量的时候,备份恢复都比较快。
xtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。