基本意义:
将数据另存到其他设备,以便于出现问题时恢复数据
为什么要备份:
灾难恢复;需求改变;测试
几个事先需要考虑的问题:
可以容忍丢失多长时间的数据?恢复要在多长时间内完成?是否需要持续提供服务?需要恢复什么:整个数据库服务器、单个数据库、一个或多个表?
备份类型:
根据是否需要数据库离线,可以分为:
冷备:cold backup
关闭mysql服务,或读写请求均不允许;
温备:warm backup
备份的同时仅支持读请求;
热备:hot backup
备份的同时,业务不受影响,读写均支持;
根据要备份的数据范围,可以分为:
完全备份:full backup,备份全部数据集;
增量备份:incremental backup,上次完全备份或增量备份以来改变了的数据;
差异备份:differential backup,上次完全备份以来改变了的数据;
组合备份:
完全+增量(二进制)+二进制日志
完全+差异(二进制)+二进制日志
根据备份数据或是文件,可以为分:
物理备份:直接备份数据文件
逻辑备份:备份表中的数据和库代码;
优点:
恢复简单;
备份的结果为ASCII文件,可以编辑;
与存储引擎无关;
可通过网络备份和恢复;
缺点:
备份或恢复都需要mysqld服务器进程参与;
备份结果占据更多的空间;
浮点数可能会丢失精度;
还原之后,索引需要重建;
备份后,要测试备份文件是否可用: 找台备机,然后恢复,测试备份文件是否可行
恢复后,要测试数据库是否可行:mysql> CHECK TABLES
需要备份什么数据:
数据库数据;
数据库配置文件;
代码:存储过程、存储函数、触发器等;(如mysqldump -E -R)E:event R:routines
Linux系统相关的配置文件;
二进制日志;
备份工具:
mysqldump:
逻辑备份工具
InnoDB热备、MyISAM温备
备份和恢复较慢;
mydumper:
多线程备份工具;
lvm-snapshot:
接近于热备的工具;
物理备份;
备份和恢复较快;
SELECT INTO OUTFILE 导出
LOAD DATA INFILE '' INTO TABLE tbname 导入
逻辑备份工具
快于mysqldump
ibbackup:
xtrabackup:
物理备份工具
InnoDB热备、MyISAM温备
速度快;
mysqlhotcopy:
几乎冷备
从备份中恢复需要的操作:
停止MySQL服务;
记录服务的配置和文件权限;
复制备份文件至数据目录;
按需调整配置;
按需改变文件权限;
尝试启动服务;
装载逻辑备份;
检查和重放二进制日志;
确定数据还原正常完成;
以完全权限重启服务器;
mysql备份工具之mysqldump的介绍-->
性质:MySQL客户端工具;
功能:备份整个服务器,单个或部分数据库,单个或部分表,表中某些行,存储过程,存储函数,触发器
能自动记录备份时的二进制日志文件及相应position;
-u #username
-h #hostname
-p #password
--all-databases
#备份所有库
-B, --databases dbname dbname
#多数据库备份
--lock-all-tables
#锁表,不可写,备份后,会自动解锁
#此参数关联的信息-->
mysql> FLUSH TABLES WITH READ LOCK;
--master-data=2
#记录备份时的二进制日志名和二进制日志位置, 0不记录,2仅注释到备份文件(CHANGE MASTER TO MASTER_LOG_FILE和MASTER_LOG-POS)
#本文作用是为了方便差异和增量备份(实际都属于二进制日志备份),记录完全备份时二进制日志的位置及二进制日志的文件名
#此参数关联的信息-->
mysql>SHOW MASTER STATUS; //查看当前binlog位置
#mysqlbinlog --start-position=xxx --stop-position=xxx binlog_name > file.sql //生成二进制日志备份文件
--single-transaction: 基于此选项能实现热备InnoDB表,不支持MyISAM;由此,不需要同时使用--lock-all-tables(既然热备,当然不需要锁表);
一次完整的备份/出错/恢复过程:
------------完全备份---------------------
InnoDB#mysqldump -uroot -pmypass --single-transaction --master-data=2 --all-databases > /backup/all_db_`date +%F`.sql
MyISAM#mysqldump -uroot -pmypass --lock-all-tables --master-data=2 --all-datebases > /backup/all_db_`date +%F`.sql
完全备份文件file1生成;
------------数据库内容写入1--------------
******************************************
------------差异备份---------------------
#less file1.sql #查看上次完全备份的sql文件,找到备份时刻的binlog位置,提供差异备份时所需的起始binlog位置xxx1
mysql> FLUSH TABLES WITH READ LOCK; #锁表
mysql>SHOW MASTER STATUS; #查看此刻binlog位置,提供差异备份时所需的末端binlog位置xxx2
#mysqlbinlog --start-position=xxx1 --stop-position=xxx2 binlog_name > file2.sql #差异备份
mysql>UNLOCAK READ;
数据库内容1备份完毕;
差异备份文件file2生成;
------------数据库内容写入2--------------
******************************************
出错,丢失
------------丢失的数据2备份--------------
#mysqlbinlog --start-position=xxx2 binlog_name #确定恢复到哪个位置,确定下xxx3
#mysqlbinlog --start-position=xxx2 --stop-position=xxx3 binlog_name > file3.sql
------------数据库内容恢复--------------
mysql>SET sql_log_bin=0 #关闭二进制日志
mysql>source
#mysql -uroot -p123456 < file1.sql #完全备份恢复,恢复内容为0~xxx1
#mysql -uroot -p123456 < file2.sql #增量备份恢复,恢复内容为xxx1~xxx2
#mysql -uroot -p123456 < file3.sql #出错的日志恢复,恢复内容为xxx2~xxx3
mysql>SET sql_log_bin=1
mysql>FLUSH PRIVILEGES;
依据二进制日志的备份,也可以切割日志,从而直接复制日志文件,再将切割后的日志文件直接导出为sql
mysql>flush logs; #滚动二进制日志
恢复后,开启mysql前,务必查看数据库文件权限
ll /mydata/data 文件权限是否正确
Mysql备份工具之LVM快照机制:
特点: 几乎热备、物理备份
前提:
事务日志必须跟数据文件在同一个LV上;#对于innodb来说,就是tbname.frm和tbname.ibd,如果不在同一个lv上,则生成的两个快照可能时间不一致
备份前配置文件先加入参数sysc_binlog=1#即任何事务提交立即同步到二进制日志上,避免事物丢失
过程:
备份过程:
mysql> FLUSH TABLES WITH READ LOCK; #读锁表,执行之后不能退出mysql,退出会解锁
mysql> FLUSH LOGS; #滚动日志,方便之后的二进制日志备份,如此以来,不用记录二进制日志的位置,因为滚动之后,会生成新的二进制日志 或 mysql> SHOW MASTER STATUS; #记录快照备份时的二进制日志,便于恢复完全备份后到真正崩溃之间的操作
创建lv_snap-->切换一个新的终端来执行,不要退出终端
#lvcreate -L 100M -n mylvsnap -p r -s /dev/mapper/myvg-mylv #为数据所在的卷创建快照(确认VG上是否有足够的空间)
#mount -t ext4 /dev/mapper/mylvsnap /mylvsnap
#cp /mylvsnap/* /backup/all_data_`date +%F`/ #复制快照内的数据库文件到备份目录
mysql> UNLOCK TABLES; #解锁
利用快照卷恢复的时候,innodb可能会有一个崩溃恢复的过程,因为快照的时候,很有可能会快照了事务提交但未同步和事务未提交的二进制日志信息(这些信息日志有,但是数据库没有对应数据),所以innodb会认为数据库曾经崩溃过
1、首先给/dev/vg01/mysql-data创建一个快照卷,通常不需要为快照卷分配和父卷一样的空间大小,一般分配父卷的10%即可。
lvcreate -s -L1G -n mysql-data-snapshot /dev/vg01/mysql-data
2、用dd命令拷贝快照设备里的文件到备份文件
dd if=/dev/vg01/mysql-data-snapshot of=/backup/mysql-data-backup.img
3、将备份文件上传到备份服务器上
建议将备份好的文件上传到远程的服务器上,以防止服务器发生意外故障而造成本地备份文件丢失。
4、快照卷现在已经不需要了,删除掉
lvremove /dev/vg01/mysql-data-snapshot
这样我们就创建好了备份。备份周期可以一天一次,写好备份脚本,每天凌晨3-5点左右进行自动备份(该时间段一般访问量最小)。
============================================
当MySQL出现问题或者其它情况我们需要恢复备份的时候,我们可以将备份好的文件恢复到LVM中去。
1、首先创建一个新LV卷
lvcreate -L10G -n mysql-data-new vg01
2、如果本地没有保存备份文件,则从备份服务器上下载最新的备份文件
3、利用/dev/loop设备挂载备份文件,通过losetup设置循环设备,循环设备可以将文件虚拟成块设备,并模拟文件系统
losetup /dev/loop0 mysql-data-backup.img
4、用dd命令拷贝loop0备份文件到新建的LV卷里
dd if=/dev/loop0 of=/dev/vg01/mysql-data-new
5、关闭mysql,必要的时候同时也要关闭webserver
/etc/init.d/mysql stop
6、重新mount,挂载lv卷到/home/mysqldata
umount /home/mysqldata
mount /dev/vg01/mysql-data-new /home/mysqldata
7、检查MySQL是否正常,如果一切正常,删除原来的硬盘文件,卸载loop设备
losetup -d /dev/loop0
lvremove /dev/vg01/mysql-data