冷、温、热备份 冷备:读写操做均不可进行 温备:读操做可执行;但写操做不可执行 热备:读写操做都可执行 MyISAM:温备,不支持热备 InnoDB:都支持 不论是热备还原仍是冷备还原,还原时都须要停服务,禁止别人访问
冷、温、热备份 冷备:读写操做均不可进行 温备:读操做可执行;但写操做不可执行 热备:读写操做都可执行 MyISAM:温备,不支持热备 InnoDB:都支持 不论是热备还原仍是冷备还原,还原时都须要停服务,禁止别人访问
mysqldump:逻辑备份工具,适用全部存储引擎,温备;支持彻底或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份 xtrabackup:由Percona提供支持对InnoDB作热备(物理备份)的工具,支持彻底备份、增量备份
mysqldump:逻辑备份工具,适用全部存储引擎,温备;支持彻底或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份 xtrabackup:由Percona提供支持对InnoDB作热备(物理备份)的工具,支持彻底备份、增量备份
https://dev.mysql.com/doc/refman/5.7/en/mysqldump.htmlhtml
mysqldump须要经过mysql协议链接数据库,因此须要数据的用户名和密码而且有必定的权限 数据库备份还原时,能够关闭二进制日志,还原数据库的过程就是执行相关的sql语句 -B:能够备份多个数据库或者备份某一个数据库 -A:备份全部数据库(排除information_schema和performance_schema这个两个数据库) -E:备份相关的全部event scheduler事件调度(计划任务) -R:备份全部存储过程和自定义函数(当有-A选项时,不用加此项) --default-character-set=utf8:指定字符集 --master-data[=#]:此选项须启用二进制日志(备份的时候记录二进制日志的位置) 当=1时:所备份的数据以前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1(CHANGE MASTER TO用于主从复制) 当=2时:有CHANGE MASTER TO语句,可是会被注释掉;此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除 非开启--single-transaction) -F:完成备份后生成新的二进制日志;配合-A或-B选项时,会致使刷新屡次数据库。建议在同一时刻执行转储和日志刷新,可经过和--single-transaction或-x, --master-data一块儿使用实现,此时只刷新一第二天志 --compact:去掉注释,适合调试,生产不使用 -d:只备份表结构,不备份表数据 -t:只备份数据,不备份create table -n:不备份create database,可被-A或-B覆盖 --flush-privileges:备份mysql或相关时须要使用;刷新权限,让权限强制生效 -f:忽略SQL错误,继续执行 --hex-blob:使用十六进制符号转储二进制列,当有包括BINARY,VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码;备份时若是有二进制数据,把二进制转 换成十六进制存放在文本中,避免形成数据破坏 -q:不查询缓存,直接输出,加快备份速度;mysqldump备份时是执行一条条的select命令,数据库会默认觉得是查询数据库,会走查询缓存 [root@centos7 ~]# mysqldump -B db2 |gzip > /data/mysql_`date +%F`.sql.gz #备份默认只是在屏幕上打印,须要输出到文件中,备份文件能够进行压缩
mysqldump须要经过mysql协议链接数据库,因此须要数据的用户名和密码而且有必定的权限 数据库备份还原时,能够关闭二进制日志,还原数据库的过程就是执行相关的sql语句 -B:能够备份多个数据库或者备份某一个数据库 -A:备份全部数据库(排除information_schema和performance_schema这个两个数据库) -E:备份相关的全部event scheduler事件调度(计划任务) -R:备份全部存储过程和自定义函数(当有-A选项时,不用加此项) --default-character-set=utf8:指定字符集 --master-data[=#]:此选项须启用二进制日志(备份的时候记录二进制日志的位置) 当=1时:所备份的数据以前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1(CHANGE MASTER TO用于主从复制) 当=2时:有CHANGE MASTER TO语句,可是会被注释掉;此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除 非开启--single-transaction) -F:完成备份后生成新的二进制日志;配合-A或-B选项时,会致使刷新屡次数据库。建议在同一时刻执行转储和日志刷新,可经过和--single-transaction或-x, --master-data一块儿使用实现,此时只刷新一第二天志 --compact:去掉注释,适合调试,生产不使用 -d:只备份表结构,不备份表数据 -t:只备份数据,不备份create table -n:不备份create database,可被-A或-B覆盖 --flush-privileges:备份mysql或相关时须要使用;刷新权限,让权限强制生效 -f:忽略SQL错误,继续执行 --hex-blob:使用十六进制符号转储二进制列,当有包括BINARY,VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码;备份时若是有二进制数据,把二进制转 换成十六进制存放在文本中,避免形成数据破坏 -q:不查询缓存,直接输出,加快备份速度;mysqldump备份时是执行一条条的select命令,数据库会默认觉得是查询数据库,会走查询缓存 [root@centos7 ~]# mysqldump -B db2 |gzip > /data/mysql_`date +%F`.sql.gz #备份默认只是在屏幕上打印,须要输出到文件中,备份文件能够进行压缩
支持温备;不支持热备,不支持事务,因此必须先锁定要备份的库,然后启动备份操做锁定方法以下: -x:加全局读锁,锁定全部库的全部表,同时加--singletransaction或--lock-tables选项会关闭此选项功能 -l:对于须要备份的每一个数据库,在启动备份以前分别锁定其全部表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会形成数据不一致 注意:以上选项对InnoDB表同样生效,实现温备,但不推荐使用
支持温备;不支持热备,不支持事务,因此必须先锁定要备份的库,然后启动备份操做锁定方法以下: -x:加全局读锁,锁定全部库的全部表,同时加--singletransaction或--lock-tables选项会关闭此选项功能 -l:对于须要备份的每一个数据库,在启动备份以前分别锁定其全部表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会形成数据不一致 注意:以上选项对InnoDB表同样生效,实现温备,但不推荐使用
支持热备,可用温备但不建议用 --single-transaction:此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务;备份前开一个事务,以事务 的方式执行备份,配合可重复读这个隔离级别(由于是可重复读的隔离级别,因此在备份期间,虽然用户有可能会更新数据,但系统备份的 数据仍是在用户没有更新数据时的样子),以此保证备份在同一个时间点;事物能够撤销一些DML语言(在开启事务期间,别人对数据的更 新,事务会自动撤销,保证数据仍是在开始事务时的最初状态),但撤销不了DDL语言(drop、alter、create),隔离级别也同样隔离不 了DDL语言,好比在别的事务中把表或者库删了,当前的事务中也看不到被删除的表或者库,因此要确保备份期间其余链接尽可能不使用 DROP、RENAME、ALTER、TRUNCATE操做 此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥 备份大型表时,建议将--single-transaction选项和--quick(-q)结合一块儿使用
支持热备,可用温备但不建议用 --single-transaction:此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务;备份前开一个事务,以事务 的方式执行备份,配合可重复读这个隔离级别(由于是可重复读的隔离级别,因此在备份期间,虽然用户有可能会更新数据,但系统备份的 数据仍是在用户没有更新数据时的样子),以此保证备份在同一个时间点;事物能够撤销一些DML语言(在开启事务期间,别人对数据的更 新,事务会自动撤销,保证数据仍是在开始事务时的最初状态),但撤销不了DDL语言(drop、alter、create),隔离级别也同样隔离不 了DDL语言,好比在别的事务中把表或者库删了,当前的事务中也看不到被删除的表或者库,因此要确保备份期间其余链接尽可能不使用 DROP、RENAME、ALTER、TRUNCATE操做 此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥 备份大型表时,建议将--single-transaction选项和--quick(-q)结合一块儿使用
mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql #-A包含了-E和-R,有-A能够不加-E、-R
mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql #-A包含了-E和-R,有-A能够不加-E、-R
mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql
mysqldump –uroot -pxxxx –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql
[root@centos7 ~]# vim bakcup_database.sh #一个数据库作一个备份 #!/bin/bash for db in `mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"`;do mysqldump -B $db | xz > /data/mysql-${db}-`date +%F`.sql.xz done [root@centos7 ~]# chmod +x bakcup_database.sh [root@centos7 ~]# ./bakcup_database.sh
[root@centos7 ~]# vim bakcup_database.sh #一个数据库作一个备份 #!/bin/bash for db in `mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"`;do mysqldump -B $db | xz > /data/mysql-${db}-`date +%F`.sql.xz done [root@centos7 ~]# chmod +x bakcup_database.sh [root@centos7 ~]# ./bakcup_database.sh
[root@centos7 ~]# mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"|sed -rn "s#(.*)#myqsldump -B \1 | xz > /data/mysql-\1-`date +%F`.sql.xz#p"|bash #sed是逐行进行处理的工具
[root@centos7 ~]# mysql -e 'show databases;'|egrep -v "^(Database|information_schema|performance_schema)$"|sed -rn "s#(.*)#myqsldump -B \1 | xz > /data/mysql-\1-`date +%F`.sql.xz#p"|bash #sed是逐行进行处理的工具
0表示周日,以此类推;周一在周日彻底备份的基础上作增量备份,至关于周一备份的是与周日数据发生变化的那部分数据;同理,周二备份的是与周一发生变化的数据;因此周一到周三的增量备份以前没有对应关系;当周四发生数据库故障,须要还原数据库时,须要用到周日的彻底备份和周1、2、三的增量备份,周三和周三之间的数据须要用二进制日志进行还原
0表示周日,以此类推;周一在周日彻底备份的基础上作增量备份,至关于周一备份的是与周日数据发生变化的那部分数据;同理,周二备份的是与周一发生变化的数据;因此周一到周三的增量备份以前没有对应关系;当周四发生数据库故障,须要还原数据库时,须要用到周日的彻底备份和周1、2、三的增量备份,周三和周三之间的数据须要用二进制日志进行还原
周日是彻底备份,周一作与周日发送数据变化的备份,周二的差别备份包含了周一的备份,周三的差别备份包含了周1、二的差别备份,因此差别备份是包含关系;当周四数据库故障,须要备份还原时,须要用到周日的彻底备份和周三的差别备份,周三和周四之间缺乏的数据须要用二进制日志进行数据还原
周日是彻底备份,周一作与周日发送数据变化的备份,周二的差别备份包含了周一的备份,周三的差别备份包含了周1、二的差别备份,因此差别备份是包含关系;当周四数据库故障,须要备份还原时,须要用到周日的彻底备份和周三的差别备份,周三和周四之间缺乏的数据须要用二进制日志进行数据还原
[root@centos7 ~]# mysql #进入mysql MariaDB [(none)]> create db3; #建立库 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db3 | | mysql | | performance_schema | +--------------------+ MariaDB [(none)]> use db3; MariaDB [(none)]> create table t1(id int); #建立表t1,表内容为空 [root@centos7 ~]# mysqldump -A -F --single-transaction --master-data=2 > /data/all.sql #作彻底备份而且记录二进制日志位置 [root@centos7 ~]# mysql #进入mysql MariaDB [(none)]> use db3; MariaDB [db3]> insert t1 value(1),(2),(3); #往t1表里面插入3条数据 MariaDB [db3]> drop table t1; #删除t1表,进行还原准备
[root@centos7 ~]# mysql #进入mysql MariaDB [(none)]> create db3; #建立库 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db3 | | mysql | | performance_schema | +--------------------+ MariaDB [(none)]> use db3; MariaDB [(none)]> create table t1(id int); #建立表t1,表内容为空 [root@centos7 ~]# mysqldump -A -F --single-transaction --master-data=2 > /data/all.sql #作彻底备份而且记录二进制日志位置 [root@centos7 ~]# mysql #进入mysql MariaDB [(none)]> use db3; MariaDB [db3]> insert t1 value(1),(2),(3); #往t1表里面插入3条数据 MariaDB [db3]> drop table t1; #删除t1表,进行还原准备
[root@centos7 ~]# less /data/all.sql #查看彻底备份 -- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=411; #找到这行,记录了二进制日志的位置,411以前为作完的彻底备份,411以后则是未作备份(二进制日志位置根据当时自身服务器的二进制日志位置而定) [root@centos7 ~]# mysqlbinlog --start-position=411 /var/lib/mysql/mariadb-bin.000001 > /data/logbin.sql #从指定位置导出二进制日志中的sql语句到一个.sql为后缀的文件中(作二进制日志备份) [root@centos7 ~]# vim /data/logbin.sql #编辑导出的文件 DROP TABLE `t1` /* generated by server */ #找到删除表的那一行,把这行必须删除;用二进制日志备份还原数据库必须删除针对删除表或者库的sql语句,由于删除表或库的操做也会记录到二进制日志中 [root@centos7 ~]# mysql #进入mysql MariaDB [(none)]> set sql_log_bin=off; #临时关闭二进制日志,避免还原过程产生大量的二进制日志 MariaDB [(none)]> use db3; MariaDB [db3]> source /data/all.sql #先还原彻底备份;建立表是在彻底备份前建立的,往表添加内容是在彻底备份以后操做的,因此不能直接用二进制日志还原,二进制日志备份中没有建立表的操做,须要配合彻底备份 MariaDB [db3]> select * from t1; #彻底备份还原完表的内容是空的 Empty set (0.00 sec) MariaDB [db3]> source /data/logbin.sql #导入二进制日志备份 MariaDB [db3]> select * from t1; #导入二进制日志备份以后,恢复 +------+ | id | +------+ | 1 | | 2 | | 3 | +------+
[root@centos7 ~]# less /data/all.sql #查看彻底备份 -- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=411; #找到这行,记录了二进制日志的位置,411以前为作完的彻底备份,411以后则是未作备份(二进制日志位置根据当时自身服务器的二进制日志位置而定) [root@centos7 ~]# mysqlbinlog --start-position=411 /var/lib/mysql/mariadb-bin.000001 > /data/logbin.sql #从指定位置导出二进制日志中的sql语句到一个.sql为后缀的文件中(作二进制日志备份) [root@centos7 ~]# vim /data/logbin.sql #编辑导出的文件 DROP TABLE `t1` /* generated by server */ #找到删除表的那一行,把这行必须删除;用二进制日志备份还原数据库必须删除针对删除表或者库的sql语句,由于删除表或库的操做也会记录到二进制日志中 [root@centos7 ~]# mysql #进入mysql MariaDB [(none)]> set sql_log_bin=off; #临时关闭二进制日志,避免还原过程产生大量的二进制日志 MariaDB [(none)]> use db3; MariaDB [db3]> source /data/all.sql #先还原彻底备份;建立表是在彻底备份前建立的,往表添加内容是在彻底备份以后操做的,因此不能直接用二进制日志还原,二进制日志备份中没有建立表的操做,须要配合彻底备份 MariaDB [db3]> select * from t1; #彻底备份还原完表的内容是空的 Empty set (0.00 sec) MariaDB [db3]> source /data/logbin.sql #导入二进制日志备份 MariaDB [db3]> select * from t1; #导入二进制日志备份以后,恢复 +------+ | id | +------+ | 1 | | 2 | | 3 | +------+