MySQL备份-全量和增量

运维就两件事:第一个保护公司的数据;第二个时网站7*24小时提供服务。

 

狭义备份
逻辑备份:(mysqldump)
物理备份:通过硬盘等介质进行拷贝


#参数-e实现非交互式对话


MySQL的备份与恢复
备份:mysqldump -uroot -p db >1.sql
恢复:mysql -uroot -p db <1.sql
只备份一个表:mysqldump -uroot -p db tb1 >2.sql
备份多个库:mysqldump -uroot -p -hlocalhost -P3306 -B db1,db2,db3 >/tmp/123.sql
备份所有库:mysqldump -uroot -p -A >A.sql
备份定时字符集:mysqldump -uroot -p --default-character=utf8 db >1.sql
恢复时也指定字符集:mysql -uroot -p --default-character=gbk db <1.sql    //默认是拉丁1的字符集


备份dept_db库:
mysqldump -uroot -p123456 dept_db >/tmp/mysql_bak.sql
查看备份sql内容:
egrep -v '#|\*|--|^$' /tmp/mysql_bak.sql
恢复dept_db库;
mysql -p123456 dept_db

用参数-B备份(推荐):
mysqldump -uroot -p123456 dept_db -B >/tmp/mysql_bak_B.sql
mysqldump -uroot -p123456 dept_db benn -B |gzip >/tmp/mysql_bak_B.sql.gz(gzip压缩备份)
-B 备份恢复方式:
mysql -uroot -p123456 -B 参数可以备份多个库,用空格隔开,并且增加use db和create database db的信息;


分库备份:
mysql -uroot -p123456 -e "show databases;" |grep -Evi '(database|infor|test|perfor|mysql)' |sed -r 's#^([a-z].*$)#mysqldump -uroot -p'123456' --events -B \1 |gzip >/opt/\1.sql.gz#g' |bash

可写入脚本:
#!/bin/bash
for dbname in `mysql -uroot -p123456 -e "show databases;" |grep -Evi '(database|infor|test|perfor|mysql)' `
do
    mysqldump -uroot -p'123456' --events -B $dbname |gzip >/opt/${dbname}.sql.gz
done
 

单库多表备份(dept_db库的SC和admin表,这里不用-B):
mysqldump -uroot -p123456 --compact dept_db SC admin >/opt/my_bak.sql
分表备份的缺点:文件多,很碎。
1、备份一个完整备份,再做一个分库分表备份
2、脚本批量恢复多个sql文件。


备份数据库表结构:-d
mysqldump -uroot -p123456 --compact -d dept_db SC admin >/opt/my_bak.sql
只备份表数据:  -t
mysqldump -uroot -p123456 --compact -t dept_db SC admin >/opt/my_bak.sql
--compact
导出更少的输出信息(用于调试)。去掉注释和头尾等结构(线上不推荐用)

 

全部数据库备份:
mysqldump -uroot -p123456 -A -B --events |gzip >/opt/my_bak.sql.gz
-A  所有数据库
-F  切割binlog日志
mysqldump -uroot -p123456 -A -B -F --events |gzip >/opt/my_bak.sql.gz


--master-data:将二进制的信息写入到输出文件中


--master-data=1
mysqldump -uroot -p123456 --master-data=1 benn >/opt/benn.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=93892;


--master-data=2(变成了注释)
mysqldump -uroot -p123456 --master-data=2 benn >/opt/benn2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=93892;


如果选项赋值为2,那么CHANGE MASTER TO 语句会被写成一个SQL comment(注释),从而只提供信息;
如果没有指定,默认值为1。那么语句不会被写成注释并且在dump被载入时生效。

 


参数小解

-x 锁全部表
-l  锁单表
mysqldump -uroot -p123456 -x >/opt/my_bak.sql.gz
mysqldump -uroot -p123456 -l >/opt/my_bak.sql.gz
备份时锁表可以保证数据一致性,但是锁表就会停止对数据库的所有操作。

 

--single-transaction参数,适合innodb事务数据库备份
myisam备份命令:
mysqldump -uroot -p123456 -A -B --master-data=2 --events >/opt/my_bak.sql.gz
innodb备份命令(推荐使用):
mysqldump -uroot -p123456 -A -B --master-data=2 --single-transaction --events|gzip >/opt/my_bak.sql.gz
inoodb在备份时,通常启用选项--single-transaction来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,
以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。


[root@cent6 work]# mysqlbinlog /data/mysql/mysql-bin.000011
mysqlbinlog: unknown variable 'default-character-set=utf8'
原因是mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8这个指令。
两个方法可以解决这个问题
一是在MySQL的配置/etc/my.cnf中将default-character-set=utf8 修改为 character-set-server = utf8,
但是这需要重启MySQL服务,如果你的MySQL服务正在忙,那这样的代价会比较大。
二是加上参数--no-defaults

mysqlbinlog --no-defaults mysql-bin.000004

 


source
恢复数据库(需要进入数据库):
语法:source 后面接上绝对路径sql文件。
实际案例:
备份数据库
数据库名为:fenghuang_db
mysqldump –u root -p fenghuang_db >/root/20171127.sql
把20171127.sql放到/root下
导入数据库
Mysql –uroot –p 密码
新建一个新数据库(要跟以前的数据库名字一样)
create databae fenghuang_db; (创建一个同名数据库 )
use fenghuang_db (使用数据库)
set names utf8; (统一编码,默认不修改)
source /root/20171127.sql

 

mysql恢复数据库(如果备份时不指定-B参数,恢复的时候一定要指定数据库名):
mysql -uroot -p dept_db 如果sql文件时压缩文件需要先解压:
gzip -d dept_db.sql.gz(-d解压,但是此参数会删除源文件)


批量恢复数据库脚本:(这里以-B备份的数据库恢复不用指定数据库名)
#!/bin/bash
cd /opt/
gzip -d *.gz
for dbname in `ls *.sql |sed 's/.sql//g'`
do
    mysql -uroot -p123456  <${dbname}.sql
done

 

 

广义备份:
Tar -g 支持三种方式进行备份
完整备份:备份指定的所有目标文件或文件夹
增量备份:仅本分atime与上次本分不同的文件或文件夹
差异备份:与增量备份差不多,只是增加了对windows文件系统的支持

每周日进行完整备份,其余每天为增量备份
完整备份:tar -g /tmp/snapshot -czvf /tmp/2016_full_systenbak.tar.gz /data/sh/
增量备份:tar -g /tmp/snapshot -czvf /tmp/2016_add_systembak.tar.gz /data/shell/

增量备份时必须要用到完整备份时作为快照的目录:例如/tmp/snapshot
/tmp/snapshot:/tmp下这个名字可以随便取;

snapshot就是快拍技术,在backup时被广泛采用。很早就被应用到阵列和主机中,主要采用Copy on Write的算法。

按日备份:恢复时间短,维护成本

还原的时候要先还原完整备份再还原增量备份:

低,占用空间多;
按周备份:正好相反。


MySQL的mysqldump备份用途
1、迁移或者升级数据库时。
2、增加从库的时候。
3、因为硬件或特殊一场情况,主库或从库宕机。
4、人为的DDL,DML语句时。
5、跨机房灾备,需要备份到异地。

企业备份频率
1、中小公司,全量一般每天一次,业务流量低谷执行全备,执行前要锁表。
2、单台数据库服务器如何增量:
用rsync(配合定时任务定点1-10分钟做切割推送),把所有binlog备份到远程服务器,或者写到网络文件系统(备份服务器)里。
例子:rsync -avz /data/mysql/mysql-bin.000* [email protected]:/backup/ --password-file=/etc/rsync.password
3、大公司周备,每周六00点一次全量,下周日-下周六00点前都是增量。
优点:节省备份时间,减少备份压力。缺点:增量的binlog文件副本太多,还原会有很多麻烦。

为什么要尽量使用主从同步:
除了分担读写压力外,还可以防止物理设备损坏数据丢失的恢复;在从库进行全量和增量方式的备份,可以防止人为对主库的误操作导致数据丢失。


全量备份(完整备份)
备份所有库:
innodb引擎备份
mysqldump -uroot -p123456 -A -B -F --default-character-set=utf8 --single-transaction --events --master-data=2 |gzip >/mysql_backup/bak_$(date +%F).sql.gz
myisam引擎备份
mysqldump -uroot -p123456 -A -B -F --default-character-set=utf8 --lock-all-tables (--events,--master-data=2) |gzip >/mysql_backup/bak_$(date +%F).sql.gz
备份一个库:
mysqldump -uroot -p123456 -B -F dbname (--events,--master-data=2) |gzip >/mysql_backup/bak_$(date +%F).sql.gz

 

增量备份恢复实战
先全备
mysqldump -uroot -p123456 -A -B -F --default-character-set=utf8 --single-transaction --events --master-data=2 |gzip >/mysql_backup/bak_$(date +%F).sql.gz
--master-data=2记录的就是全备的binlog位置,这个点以下的就是需要增量备份的binlog文件。
找到增量备份的binlog文件之后可以去删除一个库做测试
drop database db3;
删除之后把增量备份的这个binlog写入一个sql文件
mysqlbinlog --no-defaults mysql-bin.000005 >/tmp/bin.sql
打开这个sql文件把drop那行删除后导入
mysql 完毕。

提示:如果线上丢失数据量大需要先全备恢复外加增量恢复。

 

主从增量备份总结
1、停止一个从库,然后主库刷新binlog,把mysql-bin.00004恢复成bin.sql(去掉drop语句)
2、把全备bak_2018-08-14.sql及10点前的增量bin.sql恢复到从库;
3、数据丢多少?10:10分刷新binlog以后的数据。mysql-bin.00005
4、停止主库,快速把mysql-bin.00005解析为sql,恢复到从库。
5、切换到从库提供服务。

以上方案会有主键冲突问题。

 


增量恢复小结
1、人为SQL造成的误操作;
2、全备和增量结合;
3、建议恢复时对外停止更新;
4、恢复全量,然后把增量日志中有问题的SQL语句删除,恢复到数据库。

 

 

 

你可能感兴趣的:(数据库)