mysql备份与还原
备份:副本,备份的目的是为了防止数据丢失或者数据库出现问题时,进行恢复(备份存放在另一个盘)
备份类型:
热备份、温备份和冷备份
热备份:读写不受影响
温备份:仅可以执行读操作
冷备份:离线备份,读写操作均中止
物理备份与逻辑备份
物理备份:复制数据文件
逻辑备份:将数据导出至文本文件中
完全备份、增量备份和差异备份
完全备份:备份全部数据
增量备份:仅备份上次完全备份或增量备份以后的变化的数据
差异备份:仅备份上次完全备份以后的变化的数据
还原:
备份什么:以Mysql为例
数据、配置文件、二进制日志(用于即时点还原)、事务日志
热备份:
MyISAM:温备份
InnoDB:xtrabackup,mysqldump
Mysql
物理备份:速度快
逻辑备份:速度慢、丢失浮点数精度,方便使用文本处理工具直接对其处理、可移植能力强
备份策略:完全+增量;完全+差异
Mysql备份工具
mysqldump:逻辑备份工具,MyISAM(温)、InnoDB(热)
mysqlhotcopy:物理备份工具、温备份
文件系统工具
cp:冷备
lv:逻辑卷的快照功能,几乎热备
mysql>FLUSH TABLES;
mysql>LOCK TABLES
一、mysqldump工具使用
mysqldump直接备份与还原 (mysqldump DB_name [tb1] [tb2]可以备份单个数据库或表)
[root@shitouji ~]# mysqldump -uroot -p students >students.sql
[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs blog wp_options --single-transaction >/boot/wp_options.sql #备份指定库某张表
- 单张表的备份可以使用select * into outfile '存放路径及名称' from 表名 #select * into outfile '/root/test.txt' from test;
- 还原时使用load data infile '存放路径及名称' into table 表名 #load data infile '/root/test.txt' into table test;
[root@shitouji ~]# ls
jiaowu.sql mysql-community-5.7.21-1.el7.src.rpm rpmbuild sh sources students.sql
[root@shitouji ~]# mysql test < students.sql
[root@shitouji ~]# mysql -uroot -p 库名< students.sql
问:如果备份时,有其它用户在进行写时,会带来什么问题?
会带时间点的不一致
因此,要进行加锁,并且进行二进行日志滚动(滚动日志,备份时才知道从什么时候开始时行)
--master-data={0|1|2}
0:不记录二进制日志文件及路位置
1:以CHANGE MASTER TO 的方式记录位置,可用于恢复后直接启动从服务
2:以CHANGE MASTER TO 的方式记录位置,但默认是注释的
--lock-all-tables:锁定所有表
--flush-logs:执行日志flush
如果指定库中的表类型均为INNODB,可使用--single-transaction启动热备
备份多个库
--all-databases:备份所有库
--databases DB_NAME,DB_NAME,...:备份指定库
--events
--routines
--triggers
备份策略:每周完全+每天增量
完全备份:mysqldump
增量符合:备份二进制日志文件(先执行flush logs进行日志滚动)
[root@shitouji data]# mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /boot/alldata.sql
Enter password:
[root@shitouji data]# mysqlbinlog mysql-bin.000001 > /boot/1.sql #二进制日志备份
如果库中所有的表都是Innodb引擎,则可以进行热备份
show table status; #查看库中所有表的信息(包括表的所用引擎)
[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs --databases blog --single-transaction >/boot/blog.sql
#使用--single-transaction选项时,不需要再使用 --lock-all-tables来锁定表,--single-transaction选项会自动进行锁定,在备份时,保存的文件最好是有时间格式/boot/blog`date +%F%H%M%S`.sql
还原操作
[root@shitouji shitouji]# mysql -uroot -p < blog.sql #备份库还原
二、基于LVM快照备份
前提,数据要在逻辑卷上,且逻辑卷所在的卷组必须有足够的空间使用快照,.数据文件和事物日志要在同一个卷上。
原理:LVM中snapshot通过“写时复制”(copy on write) 来实现,即当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data);创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里。
操作步骤:
- 打开会话,施加读锁,锁定所有表
- mysql>flush tables with read lock;
- mysql>flush logs;
- 通过另一个终端,保存二进制日志文件及相关位置信息
- $mysql -uroot -p -e ‘show master status\G;’ > /path/to/master.info
- 创建快照卷
- #lvcreate -L 50M -s -p r -n lv_name /path/to/source_lv
- -s|--snapshot:指定创建快照
- [-p|--permission {r|rw}]:设定创建的快照具有被读或读写特性
- -n:指定快照名字
- 释放锁
- mysql>unlock tables;
- 挂载快照卷,备份
- $mount /path/to/lv_name /mnt
- $cp -a /mysql/* /backup/full-backup
- 删除快照卷
- umount /mnt
- lvremove --froce /path/to/lv_name
- 增量备份二进制日志
- $cat /path/to/master.info;查看当前二进制日志位置
- $mysqlbinlog --start-position=107 mysql-bin.000005 >/backup/bak.sql
- 当一个事务跨越不同的二进制文件时,开启通过时间备份--start-datetime
- $mysqlbinlog --start-datetime=’2016-05-06 14:55:34’ mysql-bin.00005 mysql-bin.000006 > /backup/bak-`date +%F-%H-%M-%S`.sql
还原:
- $cp -a /backup/fullbak /mysql 注意mysql目录下的文件属主是mysql
- $/etc/init.d/mysqld restart
- mysql>set sql_log_bin=0;关闭二进制日志
- mysql>source /backup/bak-`date +%F-%H-%M-%S`.sql;还原数据
- mysql>set sql_log_bin=1;
xtrabackup工具
xtrabackup 常用选项
- --user =root #使用什么用户
- --password= #用户密码
- --port= #端口号
- --socket= #套接字
- --target-dir=name #指定备份路径
--backup #与--target-dir - --copy-back
注意事项,mysql5.7后xtrabackup工具得使用2.4版本及以上,mariadb10.3版本以上,不支持xtarbackup工具,可以使用mariabackup工具
备份innobackupex --port=3306 --socket=/tmp/mysql.sock --user=root --datadir=/app/mysqldb /home/backup
xtrabackup使用参照https://www.cnblogs.com/imweihao/p/7290026.html