mysql 的备份和恢复(全量备份和增量备份)
一、mysql 全量备份和恢复
1.mysqldump 的工作原理(全量备份)
1)mysqldump 命令备份数据库的过程,实际就是把数据从 mysql 库里以逻辑的 sql 语句的形式直接输出或者生成备份文件的过程。
2)mysqldump 命令恢复数据的过程,实际就是把备份文件的 sql 语句在数据库里重新执行一下的过程。
2.mysql 的全量备份各类备份命令
1)mysql 备份单个数据库及其所有的表和数据:(注意:备份导出的是乱码没事,恢复后会正常)
格式 1:#mysqldump -u 用户名 -p 密码 数据库名 > /路径/…/备份文件名.sql #无-B 参数,恢复时需指定库名 ,要事先有该库
格式 2:#mysqldump -u 用户名 -p 密码 --default-character-set=原数据库字符集 数据库名 > /路径/…/备份文件名.sql
#指定字符集导出,无-B 参数,恢复时需指定库名
格式 3: #mysqldump -u 用户名 -p 密码 -B 数据库名 > /路径/…/备份文件名.sql #有-B 参数,恢复时不需指定库名,库无需事先存在
格式 4:#mysqldump -u 用户名 -p 密码 -B 数据库名|gzip > /路径/…/备份文件名.sql.gz #有-B 参数,恢复不需指定库(压缩备份),库无需事先存在
2)mysql 备份多个数据库及其所有的表和数据
格式 1:#mysqldump -u 用户名 -p 密码 -B 库名 1 库名 2 > /路径/…/备份文件名.sql #有-B 参数,恢复时不需指定库名,库无需事先存在
格式 2:#mysqldump -u 用户名 -p 密码 -B 库名 1 库名 2|gzip > /路径/…/备份文件名.sql.gz #有-B 参数,恢复不需指定库(压缩备份),库无需事先存在
3)mysql 备份单个表及数据(备份表不能加-B 参数)
格式: #mysqldump -u 用户名 -p 密码 库名 表名 > /路径/…/备份文件名.sql #无-B 参数,恢复时需指定库名 ,要事先有该库
4)mysql 备份多个表及数据(备份表不能加-B 参数)
格式: #mysqldump -u 用户名 -p 密码 库名 表名 1 表名 2 … > /路径/…/备份文件名.sql #无-B 参数,恢复时需指定库名 ,要事先有该库
5)mysql 备份数据库的所有库和各库下所有数据(-A)
格式: #mysqldump -u 用户名 -p 密码 -A -B --events > /路径/…/备份文件名.sql #有-B 参数,恢复时不需指定库名,库无需事先存在
6)mysql 备份时切换刷新 bin-log 日志(以备份所有数据库及数据为例,备份之后生成新的 bin-log 日志文件,参数:-A 和-F)
格式: #mysqldump -u 用户名 -p 密码 -A -B -F --events > /路径/…/备份文件名.sql #有-B 参数,恢复时不需指定库名,库无需事先存在
7)mysql 备份时指定能找到 binlog 位置点,且刷新 binlog(以备份所有数据库及数据为例,参数:-A、--master-data=1/2 和-F)
格式:# mysqldump -u 用户名 -p 密码 -A -B -F --master-data=1/2 --events > /路径/…/备份文件名.sql #有-B 参数,恢复时不需指定库名,…
8)mysql 备份数据库表结构(只备份表结构,不包含数据,加-d 参数)
a.备份单个库的所有表的结构(不包含数据)
格式: #mysqldump -u 用户名 -p 密码 -B -d 库名 > /路径/…/备份文件名.sql #有-B 参数,恢复时不需指定库名,库无需事先存在
b.备份单个库的某个表的结构(不包含数据)
格式: #mysqldump -u 用户名 -p 密码 -B -d 库名 表名 > /路径/…/备份文件名.sql #有-B 参数,恢复不需指定库名,库无需事先存在
其他常用参数介绍和注意事项:
1)以上参数可以根据情况灵活使用,不限于固定哪种格式。各参数之间可以灵活增减,根据业务需求使用参数。
2)备份时切换用-F 参数刷新 bin-log 日志使用好处和坏处
好处是:当数据库被删除后,在恢复数据全备时候,全备之前的 bin-log 日志就可以不考率了,全备里面已经有了这些语句,而只需恢复全备后,
将全备日期后面的新的 bin-log 日志做增量恢复即可,减少了恢复复杂度。
坏处是:如果多库分库备份,那么每次备份都刷新 binlog,导致 binlog 日志文件过多,增量恢复时候比较复杂。
3)参数-B 的作用:
a)如果不加-B 参数时的备份,备份文件中就没有建库和切库的语句,在恢复时候需指定库名,且要恢复的数据库必须要事先存在该库名,若没有该
库,需手动创建一个该库名,还需要考虑建库时候的字符集,也倒是能解决,但是比较麻烦。
b)如果加了-B 参数时的备份,备份文件中就有建库和切库的语句,在恢复时候不需指定库名,且要恢复的数据库也不需要事先有该库名,即使 drop
掉该库也没事。-B 的另一个作用还可以备份多个库,恢复时候也不需指定库,也不需事先存在该库。
c)备份多个库时候,需要使用-B 参数。
4)参数--master-data=1/2
如果备份时候不刷新 bin-log 日志(也可刷-F),也可使用参数--maste-data=1/2 自动能在备份文件中形成 bin-log 日志文件名及对应的位置点,
可以自动查找 binlog 位置点,值 1 和 2 的区别是:2 是 能 增 加 注 释 , 1 没有注释,一般情况使用 2 就可以,如果做主从同步时候使用
--master-data=1,可以在从库上 change master…时候,不用指定 binlog 日志和位置点。
5)参数--events 的作用
备份时候,如果有警告(当然也可忽略没事),可以使用该参数,忽略警告。
6)参数-x (备份时候锁表,适用于 myisam 引擎和 innodb 引擎)
备份时候一般需要锁表,确保数据一致性,-x 参数是备份时候锁表,常适用于 myisam 引擎的,也可用用 innodb 的,但前者好。
7)参数--single-transaction (备份时候相当于锁表,仅适用于 innodb 引擎)
备份时候一般需要锁表,确保数字一致性,--single-transaction 来保证备份的一致性,实际上他的工作原理是设定本次会话的隔离级别为:
repeatable_read,以确保本次会话(dump)时,不会看到其他会话已经提交了数据,仅适用于 innodb 引擎
8)参数-t (备份时候只备份数据)
-t 参数是备份时候只备份数据
9)参数-d(只备份表结构,不包含数据)
只备份表结构,不包含数据,加-d 参数
3.myisam 引擎和 innodb 引擎的全量备份方式区别和最常用的备份命令 (参数根据需求灵活使用)
全量备份(备份整个数据库,一般不刷新):
myisam 引擎的全量备份:(全部数据库备份为例)
#mysqldump -u 用户名 -p 密码 -A -B --master-data=1/2 -x --events |gzip > /路径/…/all.sql.gz
innodb 引擎的全量备份:(全部数据库备份为例),一般用--single-transaction 参数,仅适用于 innodb 引擎
#mysqldump -u 用 户 名 -p 密 码 -A -B --master-data=1/2 --events --single-transaction|gzip > / 路 径
/…/all.sql.gz
若是混合引擎(myisam 和 innodb 都有): 建议以 myisam 引擎的备份格式为主,锁表-x 备份。
全量备份(备份单个数据库,一般刷新-F):
myisam 引擎的全量备份:(单个数据库备份为例)
#mysqldump -u 用户名 -p 密码 -B -F 数据库名 --master-data=1/2 -x --events |gzip > /路径/…/all.sql.gz
innodb 引擎的全量备份:(单个数据库备份为例),一般用--single-transaction 参数,仅适用于 innodb 引擎
#mysqldump -u 用户名 -p 密码 -B -F 数据库名 --master-data=1/2 --events --single-transaction|gzip > /路径/…/all.sql.gz
全量备份(多库分库备份,写脚本,一般不刷新):
myisam 引擎的全量备份:(多库分库备份为例)
[root@localhost ~]# cat fenku.beifen.sh
#!/bin/bash
for dbname in `mysql -uroot -p123 -e "show databases;"|grep -Evi "database|infor|perfor"`
do
mysqldump -uroot -p123 -B $dbname --master-data=1/2 --events -x |gzip > /bak/${dbname}_bak.sql.gz
done
innodb 引擎的全量备份:(多库分库备份为例)
[root@localhost ~]# cat fenku.beifen.sh innode 引擎
#!/bin/bash
for dbname in `mysql -uroot -p123 -e "show databases;"|grep -Evi "database|infor|perfor"`
do
mysqldump -uroot -p123 -B $dbname --master-data=1/2 --events --single-transaction|gzip > /bak/${dbname}_bak.sql.gz
done
注意:一般使用备份时都要锁表
1)各参数解释:
-x 锁表,--single-transaction 相当于锁表(仅适合 innodb 引擎),-F 刷新切换 binlog 日志,-A 备份全部数据库,-B 加建库切空库语句,恢复时
不用指定具体库名,--master-data=1/2,备份的文件里都带 binlog 的位置点和 binlog 文件名,等于 2 的是加了注释,等于 1 的是没加注释,一般