mysql备份和恢复:
1、灾难恢复;
2、审计;
3、测试;
备份:目的用于恢复;对备份数据做恢复测试;
备份类型:
根据备份时,数据库服务器是否在线:
冷备:cold backup
温备:warm backup
热备:hot backup
根据备份的数据集:
完全备份:full backup
部分备份: partial backup
根据备份时的接口(直接备份数据文件还是通过mysql服务器导出数据):
物理备份:直接复制(归档)数据文件的备份方式;physical backup
逻辑备份:把数据从库中提出出来保存为文本文件;logical backup
mysqldump
根据备份时是备份整个数据还是仅备份变化的数据:
完全备份:full backup
增量备份:incremental backup
差异备份:differential backup
备份策略:
选择备份方式
选择备份时间
考虑到恢复成本
恢复时长
备份成本:
锁时间
备份时长
备份负载
备份对象:
数据
配置文件
代码:存储过程,存储函数,触发器
OS相关的配置文件,如crontab配置计划及相关的脚本
跟复制相关的配置;
二进制日志文件
备份工具:
mysqldump:逻辑备份工具
InnoDB热备、MyISAM温备、Aria温备
备份和恢复过程较慢
mysqldumper: 多线程的mysqldump
很难实现差异或增量备份;
lvm-snapshot:
接近于热备的工具:因为要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁;
使用cp、tar等工具进行物理备份;
备份和恢复速度较快;
很难实现增量备份,并且请求全局需要等待一段时间,在繁忙的服务器上尤其如此;
SELECT clause INTO OUTFILE '/path/to/somefile'
LOAD DATA INFILE '/path/from/somefile'
部分备份工具, 不会备份关系定义,仅备份表中的数据;
逻辑备份工具,快于mysqldump
Innobase: 商业备份工具, innobackup
Xtrabackup: 由Percona提供的开源备份工具
InnoDB热备,增量备份;
MyISAM温备,不支持增量;
物理备份,速度快;
mysqlhotcopy: 几乎冷备
mysqldump:
mysqldump [options] [db_name [tbl_name ...]]
备份单个库:mysqldump [options] db_name
恢复时:如果目标库不存在,需要事先手动创建
--all-databases: 备份所有库
--databases db1 db2 ...: 备份指定的多个库
注意:备份前要加锁
--lock-all-tables:请求锁定所有表之后再备份,对MyISAM、InnoDB、Aria做温备
--single-transaction: 能够对InnoDB存储引擎实现热备;
备份代码:
--events: 备份事件调度器代码
--routines: 备份存储过程和存储函数
--triggers:备份触发器
备份时滚动日志:
--flush-logs: 备份前、请求到锁之后滚动日志;
复制时的同步位置标记:
--master-data=[0|1|2]
0: 不记录
1:记录为CHANGE MASTER语句
2:记录为注释的CHANGE MASTER语句
使用mysqldump备份:
请求锁:--lock-all-tables或使用--singe-transaction进行innodb热备;
滚动日志:--flush-logs
选定要备份的库:--databases
记录二进制日志文件及位置:--master-data=
恢复:
建议:关闭二进制日志,关闭其它用户连接;
备份策略:基于mysqldump
备份:mysqldump+二进制日志文件;
周日做一次完全备份:备份的同时滚动日志
周一至周六:备份二进制日志;
恢复:
完全备份+各二进制日志文件中至此刻的事件
对MySQL配置文件,以及与MySQL相关的OS配置文件在每次修改后都应该直接进行备份;
备份步骤:
1、请求全局锁,并滚动日志
mysql> FLUSH TABLES WITH READ LOCK;
mysql> FLUSH LOGS;
2、做二进制日志文件及位置标记(手动进行);
# mysql -e 'show master status' > /path/to/somefile
3、创建快照卷
# lvcreate -L -s -n -p r /path/to/some_lv
4、释放全局锁
mysql> UNLOCK TABLES;
5、挂载快照卷并备份
# cp
6、备份完成之后,删除快照卷
恢复:
1、二进制日志保存好;
提取备份之后的所有事件至某sql脚本中;
2、还原数据,修改权限及属主属组等,并启动mysql
3、做即时点还原
mylvbackup: perl脚本,快速基于Lvm备份mysql
xtrabackup:
备份 注意:
1、将数据和备份放在不同的磁盘设备上;异机或异地备份存储较为理想;
2、备份的数据应该周期性地进行还原测试;
3、每次灾难恢复后都应该立即做一次完全备份;
4、针对不同规模或级别的数据量,要定制好备份策略;
5、二进制日志应该跟数据文件在不同磁盘上,并周期性地备份好二进制日志文件;
从备份中恢复应该遵循步骤:
1、停止MySQL服务器;
2、记录服务器的配置和文件权限;
3、将数据从备份移到MySQL数据目录;其执行方式依赖于工具;
4、改变配置和文件权限;
5、以限制访问模式重启服务器;mysqld的--skip-networking选项可跳过网络功能;
方法:编辑my.cnf配置文件,添加如下项:
skip-networking
socket=/tmp/mysql-recovery.sock
6、载入逻辑备份(如果有);而后检查和重放二进制日志;
7、检查已经还原的数据;
8、重新以完全访问模式重启服务器;
注释前面在my.cnf中添加的选项,并重启;
SELECT clause INTO OUTFILE ''
LOAD DATA INFILE '' INTO TABLE tb_name