适用场景
硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景
备份注意要点
备份类型
二进制日志文件不应该与数据文件放在同一磁盘
冷、温、热备份
常用存储引擎支持备份类型
备份方法
备份时需要考虑的因素
备份什么
备份工具
[root@hai7-6 hellodb]$systemctl stop mariadb
1. '打包数据库工作目录并压缩'
[root@hai7-8 data]$tar Jcvf /data/mysql.bak.`date +%F`.tar.xz /data/mysql/
2. '将数据发送到预还原主机上'
[root@hai7-8 data]$scp /data/mysql.bak.2018-10-13.tar.xz 192.168.50.100:/data
3. '将配置文件发送到预还原主机'
[root@hai7-8 data]$scp /etc/my.cnf 192.168.50.100:/data
[root@hai7-8 mysql]$mv /data/my.cnf /etc/my.cnf
[root@hai7-8 mysql]$tar xf mysql.2018-10-13.tar.xz
[root@hai7-8 mysql]$mv * /var/lib/mysql
[root@hai7-6 data]$pvcreate /dev/sda7
[root@hai7-6 data]$vgcreate vg_mysql /dev/sda7
[root@hai7-6 data]$lvcreate -n mysqldata -L 2G vg_mysql
[root@hai7-6 data]$lvcreate -n mysqlbin -L 4G vg_mysql
[root@hai7-6 data]$mkfs.xfs /dev/vg_mysql/mysqlbin
[root@hai7-6 data]$mkfs.xfs /dev/vg_mysql/mysqldata
[root@hai7-6 data]$mkdir /vg_data/{mysqlbin,mysqldata} -pv
'将逻辑卷分别挂载到目录上'
[root@hai7-6 data]$mount /dev/vg_mysql/mysqlbin /vg_data/mysqlbin/
[root@hai7-6 data]$mount /dev/vg_mysql/mysqldata /vg_data/mysqldata/
[root@hai7-6 data]$chown mysql.mysql /vg_data/
[root@hai7-6 ~]$vim /etc/my.cnf
[mysqld]
innodb_file_per_table
datadir=/vg_data/mysqldata <=将数据库路径修改为刚才建立的路径
log_bin=/vg_data/mysql-bin <=将二进制日志保存路径修改为以上建立的新目录
'启动服务'
[root@hai7-6 data]$systemctl start mariadb
MariaDB [(none)]> reset master;
[root@hai7-6 data]$mysql < hellodb_innodb.sql
[root@hai7-6 data]$mysql -e 'FLUSH TABLES WITH READ LOCK'
[root@hai7-6 data]$mysql -e 'SHOW MASTER logs' > bin.log
[root@hai7-6 data]$cat bin.log
Log_name File_size
mysql-bin.000001 7655 <==备份时二进制日志位置
[root@hai7-6 mapper]$lvcreate -p r -s -n snap_mysql -L 1G /dev/mapper/vg_mysql-mysqld
[root@hai7-6 mapper]$mysql -e 'UNLOCK TABLES'
MariaDB [hellodb]> INSERT teachers values(6,'B','30','F');
MariaDB [hellodb]> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8059 | <==二进制日志文件更新后大小
由于UUID相同,所以挂载快照卷需要加-o nouuid,norecovery
[root@hai7-6 vg_mysql]$mount -o nouuid,norecovery /dev/vg_mysql/snap_mysql /mnt
将快照下备份的数据拷贝到出来
[root@hai7-6 vg_mysql]$cp -av /mnt/* /data/
取消挂载
[root@hai7-6 vg_mysql]$umount /mnt
删除逻辑快照
[root@hai7-6 vg_mysql]$lvremove /dev/vg_mysql/snap_mysql
[root@hai7-6 vg_mysql]$rm -rf /vg_data/mysqldata/*
[root@hai7-6 vg_mysql]$cp -av /data/* /vg_data/mysqldata/
'备份数据时已经记录的二进制日志位置为mysql-bin.000001 7655 ,导出之后所有记录,多个文件需追加到同一文件'
[root@hai7-6 ~]$mysqlbinlog --start-position=7655 /vg_data/mysql-bin.000001 > /root/binlong.sql
[root@hai7-6 ~]$mysqlbinlog /vg_data/mysql-bin.000002 >> /root/binlong.sql
MariaDB [(none)]> SET sql_log_bin=off;
MariaDB [(none)]> SOURCE /root/binlong.sql
MariaDB [(none)]> SET sql_log_bin=on;
MariaDB [hellodb]> SELECT * FROM teachers;
语法格式
mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…]
mysqldump [OPTIONS] --all-databases [OPTIONS]
常见选项
-A
| --all-databases
:备份所有数据库,含create database
-B
| --databases db_name…
:指定备份的数据库,包括create database语句
-E
| --events
:备份相关的所有event scheduler(调度器),计划任务之类的,-A包含-E
-R
| --routines
:备份所有存储过程和自定义函数, -A包含
--triggers
:备份表相关触发器,默认启用,用--skip-triggers
,不备份触发器
--default-character-set=utf8
:指定字符集
--master-data[=#]
: 此选项须启用二进制日志
'记录备份时,二进制日志文件所在位置,说明在此位置之前的数据做了备份'
[root@hai7-6 data]$mysqldump -A --master-data=1 > all.sql
'查看备份数据'
[root@hai7-6 data]$vim all.sql
'多出如下行,如果设置为--master-data=2,只是将如下行注释掉,仅做描述'
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=34742814;
-F, --flush-logs
:备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和--single-transaction
或-x
,--master-data
一起使用实现,此时只刷新一次日志,添加此选项可以区分备份前二进制文件和备份后二进制文件,不需要去文件中找备份位置
1. '当前二进制日志文件是两个1和2'
[root@hai7-6 data]$mysql -e 'show master logs;'
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8078 |
| mysql-bin.000002 | 34742814 |
+------------------+-----------+
2. '备份两个数据库hi和mysql'
[root@hai7-6 data]$mysqldump -F -B hi mysql > ba.back.sql
3. '生成2个新的日志文件,也就是选项描述中-A、-B是会刷新多次,和备份多少个数据库有关'
[root@hai7-6 data]$mysql -e 'show master logs;'
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8078 |
| mysql-bin.000002 | 34742857 |
| mysql-bin.000003 | 288 | <==刷新的二进制日志文件
| mysql-bin.000004 | 245 | <==刷新的二进制日志文件
+------------------+-----------+
--compact
: 去掉注释,适合调试,导出的文件没有注释描述,不推荐使用,有可能丢失关键信息,比如master-data=2记录的二进制备份位置
-d, --no-data
: 只备份表结构
-t, --no-create-info
: 只备份数据,不备份create table
-n,--no-create-db
: 不备份create database,可被-A或-B覆盖
--flush-privileges
:备份系统数据库mysql时需要使用
-f, --force
: 忽略SQL错误,继续执行
--hex-blob
: 使用十六进制符号转储二进制列(例如,“abc”变为0x616263),受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT
-q, --quick
: 不缓存查询,直接输出,加快备份速度
备份还原示例
[root@hai7-6 data]$mysqldump hellodb > /data/hellodb_bak.sql
[root@hai7-6 data]$mysql -e 'drop database hellodb'
1. '创建数据库,很可能与原创建属性不同'
[root@hai7-6 data]$mysql -e 'create database hi'
2. '将数据导入新建的数据库中(这里必须指定数据库),完成恢复'
[root@hai7-6 data]$mysql hi < /data/hellodb_bak.sql
[root@hai7-6 mysqldata]$mysqldump -A > /data/all'data+%F'.sql
查看导出的数据
[root@hai7-6 mysqldata]$vim /data/alldata+%F.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hi` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `hi`; <==创建数据库的SQL语句,只要有的数据库都会输出创建语句
选项-B'可以同时备份多个,例如hi和mysql两个数据库'
[root@hai7-6 mysqldata]$mysqldump -B hi mysql > /data/b'data+%F'.sql
[root@hai7-6 mysqldata]$mysql -e 'drop database hi'
[root@hai7-6 mysqldata]$mysql -e 'drop database mysql'
'查看删除后数据库保留情况'
[root@hai7-6 mysqldata]$mysql -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| test |
+--------------------+
[root@hai7-6 mysqldata]$mysql < /data/bdata+%F.sql
[root@hai7-6 mysqldata]$mysql -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi |
| mysql |
| performance_schema |
| test |
+--------------------+
输出备份数据时同时压缩
压缩工具默认是读取屏幕输出,压缩导入指定文件,可以配合mysqldump工具,直接压缩备份文件
[root@hai7-6 ~]$mysqldump -B hi |gzip > /data/a.sql.gz
编制脚本,实现将mysql中的数据库分库备份
[root@hai7-6 data]$mysql -e 'show databases' |cat
Database <==表头,不需要备份
information_schema <==状态信息,不需要备份
hi
mysql
performance_schema <==状态信息,不需要备份
test
[root@hai7-6 data]$mysql -e 'show databases' | grep -Ev 'Database|information|performance'|while read dbname ;do mysqldump -B $dbname|gzip > /data/${dbname}_bak`date +%F`.gz;done
方法2 :使用sed语句实现[root@hai7-6 data]$mysql -e 'show databases'|grep -Ev '^Database|info|perfor'|sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1_bak`date +%F`.gz@'|bash
方法3:使用for循环[root@hai7-6 data]$for db in `mysql -e 'show databases'|grep -Ev '^Database|info|perfor'`;do mysqldump -B $db |gzip > /data/${db}_bak`date +%F`.gz;done
MyISAM
支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
锁定方法如下:
-x,--lock-all-tables
:加全局读锁,锁定所有库的所有表,同时加–single-transaction或–lock-tables选项会关闭此选项功能-l,--lock-tables
:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables
选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致InnoDB备份选项
支持热备,可用温备但不建议用温备
--single-transaction
:单事务转储mysqldump -uroot -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/backup/fullbak_$BACKUP_TIME.sql
mysqldump -uroot -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/BACKUP/fullbak_$BACKUP_TIME.sql
[root@hai7-6 ~]$vim /etc/my.cnf
datadir=/vg_data/mysqldata <==数据文件路径
log_bin=/vg_data/mysqlbin/mysql_bin <==二进制日志文件路径
[root@hai7-6 ~]$mysqldump -A -F --single-transaction --master-data=2 --hex-blob|gzip > /data/all_back.aql.gz
MariaDB [hi]> INSERT teachers VALUES(10,'A',40,'M')
MariaDB [hi]> INSERT teachers VALUES(11,'B',50,'M');
[root@hai7-6 data]$rm -rf /vg_data/mysqldata/*
[root@hai7-6 mysqlbin]$systemctl stop mariadb
'启动服务,让系统自动生成系统数据库'
[root@hai7-6 mysqlbin]$systemctl start mariadb
[root@hai7-6 data]$gzip -d all_back.aql.gz
1. '停止二进制日志服务'
MariaDB [(none)]> SET sql_log_bin=off;
2. '还原完全备份数据'
MariaDB [(none)]> source /data/all_back.aql
3. '查看完全备份还原效果'
MariaDB [hi]> SELECT * FROM teachers; <==没有第3步添加的,备份后数据
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | a | 20 | M |
| 6 | B | 30 | F |
| 8 | c | 100 | M |
+-----+---------------+-----+--------+
1. '查看备份文件,确认二进制日志文件完全备份时位置'
[root@hai7-6 data]$vim all_back.aql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000002', MASTER_LOG_POS=245;
2. '将245位置后的二进制日志内容导入至文件in.sql中'
[root@hai7-6 data]$mysqlbinlog --start-position=245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql
3. '进入mysql,停止二进制日志功能'
MariaDB [(none)]> SET sql_log_bin=off;
4. '将备份后生成的二进制文件导入数据库中'
MariaDB [hi]> SOURCE /data/in.sql
5. '恢复二进制日志记录功能'
MariaDB [hi]> SET sql_log_bin=on
6. '查看恢复效果'
MariaDB [hi]> SELECT * FROM teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | a | 20 | M |
| 6 | B | 30 | F |
| 8 | c | 100 | M |
| 10 | A | 40 | M | <==备份后数据,恢复成功
| 11 | B | 50 | M |
+-----+---------------+-----+--------+
前面步骤相同,在恢复到备份文件点后,需要在二进制日志文件中,找出误删除操作,注释掉或者删除,然后将备份后二进制日志文件追加导出至指定文件,再导入系统
[root@hai7-6 data]$mysqlbinlog --start-position=245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql
[root@hai7-6 data]$mysqlbinlog /vg_data/mysqlbin/mysql_bin.000003 >> in.sql
官方网站
xtrabackup是由Percona公司开发的工具
官网:https://www.percona.com
手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
简介
percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具
特点:
安装xtrabackup
[root@hai7-6 data]$ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 Oct 14 18:23 /usr/bin/innobackupex -> xtrabackup
Xtrabackup备份
--user
--password
--host
--databases
--defaults-file
--incremental
--incremental-basedir
--incremental-dir
--include=name
Xtrabackup准备阶段(Prepare)
--apply-log
--use-memory
--apply-log
选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G--export
--redo-only
--apply-log-only
Xtrabackup还原阶段
--copy-back
--move-back
--force-non-empty-directories
innobackupex --copy-back
或--move-back
选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back
和--move-back
文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败Xtrabackup使用这个过程分为三个阶段
还原工作原理
--apply-log-only或--read-only
,使其处于中间状态,在还原T3时,凑齐另一半,尽可能的保证数据完整还原注意事项
chown -R mysql:mysql /data/mysql
备份生成的相关文件
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:
innobackupex --user=root /backups
scp -r /backups/2018-02-23_11-55-57/ 目标主机:/data/
innobackupex --apply-log /data/2018-02-23_11-55-57/
systemctl stop mariadb
rm -rf /var/lib/mysql/*
innobackupex --copy-back /data/2018-02-23_11-55-57/
chown -R mysql.mysql /var/lib/mysql/
systemctl start mariadb
在原主机
[root@hai7-6 ~]$xtrabackup --backup --target-dir=/data
[root@hai7-6 ~]$scp -r /data 192.168.50.111:/data
在目标主机上
[root@hai7-6 ~]$systemctl stop mariadb
[root@hai7-6 ~]$rm -rf /var/lib/mysql/*
[root@hai7-8 data]$xtrabackup --prepare --target-dir=/data/data
[root@hai7-8 data]$xtrabackup --copy-back --target-dir=/data/data
'拷贝完成后的属性'
[root@hai7-8 ~]$ll /var/lib/mysql/
drwxr-x--- 2 root root 310 Oct 15 10:04 hi
'还原属性'
[root@hai7-8 ~]$chown -R mysql:mysql /var/lib/mysql
systemctl start mariadb
innobackupex /backups
mkdir /backups/inc{1,2}
--incremental
选项,表示为增量备份innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42(完全备份生成的路径)
innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17 (上次增量备份生成的路径)
scp -r /backups/* 目标主机:/data/
rm -rf /var/lib/mysql/*
innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc1/2018-02-23_14-26-17
innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc2/2018-02-23_14-28-29/
innobackupex --copy-back /data/2018-02-23_14-21-42/
chown -R mysql.mysql /var/lib/mysql/
systemctl start mariadb
[root@hai7-6 data]$mkdir {base,inc1,inc2}
[root@hai7-6 data]$xtrabackup --backup --target-dir=/data/base
[root@hai7-6 data]$mysql -e 'use hi; INSERT teachers VALUES(12,"AB",25,"F")'
[root@hai7-6 data]$xtrabackup --backup --target-dir=/data/inc1 --incremental-basedir=/data/base
[root@hai7-6 data]$mysql -e 'use hi; INSERT teachers VALUES(13,"BB",31,"M")'
[root@hai7-6 data]$xtrabackup --backup --target-dir=/data/inc2 --incremental-basedir=/data/inc1
[root@hai7-6 data]$scp -r /data/ 192.168.50.111:/data
[root@hai7-8 data]$xtrabackup --prepare --apply-log-only --target-dir=/data/data/base
完全备份
[root@hai7-8 data]$xtrabackup --prepare --apply-log-only --target-dir=/data/data/base --incremental-dir=/data/data/inc1
完全备份
:最后一次还原不需要加选项–apply-log-only[root@hai7-8 data]$xtrabackup --prepare --target-dir=/data/data/base --incremental-dir=/data/data/inc2
[root@hai7-8 data]$xtrabackup --copy-back --target-dir=/data/data/base
[root@hai7-8 base]$chown -R mysql:mysql /var/lib/mysql
[root@hai7-8 base]$systemctl start mariadb
--include
表示指定哪个表来备份,后跟导出目录[root@hai7-8 ~]$innobackupex -uroot -p123456 --include='hellodb.students' /backups
[root@hai7-8 ~]$mysql -p123456 -e 'SHOW CREATE TABLE hellodb.students'> students.sql
[root@hai7-8 ~]$mysql -pfree123456 -e 'DROP TABLE hellodb.students'
--export
'导出后会在备份目录多出2个文件students.cfg和students.exp'
[root@hai7-8 ~]$innobackupex --apply-log --export /backups/2018-10-15_11-19-23/
MariaDB [hellodb]> CREATE TABLE `students`
> (\n `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
> \n `Name` varchar(50) NOT NULL,
> \n `Age` tinyint(3) unsigned NOT NULL,
> \n `Gender` enum('F','M') NOT NULL,
> \n `ClassID` tinyint(3) unsigned DEFAULT NULL,
> \n `TeacherID` int(10) unsigned DEFAULT NULL,
> \n PRIMARY KEY (`StuID`),
> \n KEY `index_age` (`Age`),
> \n KEY `idx_name_age` (`Name`,`Age`)\n)
> ENGINE=InnoDB
> AUTO_INCREMENT=26
> DEFAULT CHARSET=utf8;
MariaDB [hellodb]> ALTER TABLE students DISCARD TABLESPACE;
[root@hai7-8 ~]$cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /data/mysql/hellodb/
[root@hai7-8 hellodb]$ chown -R mysql.mysql /data/mysql/hellodb
MariaDB [hellodb]> ALTER TABLE hellodb.students IMPORT TABLESPACE;