逻辑备份
逻辑备份用于备份数据库的结构(CREAET DATABASE、CREATE TABLE)和数据(INSERT),这种备份类型适合数据量小、跨SQL服务器、需要修改数据等场景。如mysqldump命令就是产生一个逻辑备份工具,使用mysqldump输出的文件包含CREATE TABLE和INSERT语句,能够直接重建表内容和表结构。
使用逻辑备份有以下优势和劣势:
优势
可移植性高,SQL语句可直接适用于其他SQL服务器;
在数据恢复之前可增加、修改数据;
数据恢复粒度小可以是服务器、数据库、表级别;
使用文本格式,可读性高;
劣势
备份时需要访问mysql服务器,影响其他客户端;
需要将数据转换成逻辑格式(SQL,CSV);
如果命令运行在客户端,mysql服务器还需要将数据发送给客户端;
因为输出格式为文本文件,占用空间较大;
物理备份
物理备份是包括存储数据库内容的目录和文件的副本,这种类型的备份适用于需要在出现问题时快速恢复的大型重要数据库。
优势
完整的Mysql文件和目录备份,只需要复制文件不需要转换,速度比逻辑备份更快;
除了备份数据,还能备份配置文件和日志文件;
不需要运行Mysql服务器就可以完成备份;
备份工具简单使用cp、scp、tar命令即可完成备份;
劣势
可移植性不高,恢复数据只适用于相同或类似的机器上;
为了保持数据库文件的一致性,需要停机备份;
恢复粒度不能按表或用户恢复;
在线备份需要mysql服务器处理运行状态,以便备份工具从mysql服务器中获取数据。离线备份表示mysql服务器处理停止状态。两种备份形式也可以称为“热备份”和“冷备份“。
在线备份的主要特性
备份不需要停机,对其他客户端影响较小其他连接能够正常访问mysql服务器(依赖操作类型,如读操作);
备份需要加锁,以免在备份期间对数据做出修改;
离线备份的主要特性
备份期间服务器不可用;
备份过程更简单,不会受到客户端的干扰;
逻辑备份(mysqldump使用)
mysqldump属于逻辑备份命令,使用mysqldump备份的优势是它非常方便和灵活,可以直接编辑输出文件或者使用导入到其他的SQL服务器中去,但是它不能用作备份大量数据的快速解决方案,对于大数据量,即使备份花费的时候可以接受,但是恢复数据也可能会非常缓慢,因为执执行SQL语句会涉及磁盘I/O进行插入,创建索引等。mysqldump的使用方式非常简单:
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
使用mysqldump备份时要注意:数据库的一致状态,在执行mysqldump命令时要保证数据不会再发生变更,保持数据的一致性有二种方法:
使Mysql服务器只读
使用事务加上隔离级别:REPEATABLE READ
使用REPEATABLE READ事务隔离级别执行mysqldump命令(使用事务保持数据库的一致状态):
mysqldump --master-data=2 \
--flush-logs \
--single-transaction \
--all-databases > /backup/`date +%F-%H`-mysql-all.sql
备份参数说明:
--master-data: 将二进制日志文件的名称和位置备份
--flush-logs: 开始备份之前刷新mysql服务器日志文件
--single-transaction:开始备份之前设置事务隔离级别为REPEATABLE READ然后发送一个START TRANSACTION命令。
--all-databases:备份所有数据库
物理备份(复制原始文件)
为了保证复制文件的完整性,备份原始文件最好是停止mysql服务器,复制原始文件备份由以下步骤完成:
停止mysql服务器
$ mysqladmin shutdown
使用合适的工具复制原始数据文件
$ tar cf /tmp/dbbackup.tar ./data
备份完成后,运行mysql服务器
$ mysqld_safe
使用主从备份模式
使用mysqldump和tar备份或多或少都会对业务产生影响,使用mysqldump备份需要对数据加锁,加锁就意味着其他客户端操作受到限制。使用tar命令需要停止服务器直接导致数据库服务器不可用,有没有办法能解决这两种问题呢?答案是有的,就是使用主从备份模式。
在单机的基础上增加一台Slave机器对Master机器的数据进行同步:
开始备份时对Slave进行备份,这样即使Slave停机或对数据加锁也不会影响业务的正常使用,如果公司有条件或业务非常重要可以选择这种方案来备份数据。
1.线上环境有时候考虑到需要做增量备份数据库,所以写了个简单的脚本
2.添加自动任务每小时或者更短时间执行就好了
#!/bin/sh
#author RuM
#date 2015-07-10
BAKDIR=/tmp/mysqlbak
BAKDIR_FULL=$BAKDIR/full
BAKDIR_ADD=$BAKDIR/add
CONF=/etc/my.cnf
passwd=123456
INNOBACKUPEX=/usr/bin/innobackupex
第一次执行会做一次全备跟增备,以后执行都会是增量备份
if [ -f "$INNOBACKUPEX" ]
then
if [ -d "$BAKDIR" ]
then
echo "is ok"
else
mkdir $BAKDIR_FULL -p
mkdir $BAKDIR_ADD -p
fi
全备
files=`ls $BAKDIR_FULL`
if [ -z "$files" ]
then
$INNOBACKUPEX --defaults-file=$CONF --user=root --password=$PASSWD $BAKDIR_FULL
FULLNAME=$(dir "$BAKDIR_FULL")
$INNOBACKUPEX --defaults-file=$CONF --user=root --password=$PASSWD --incremental-basedir=$BAKDIR_FULL/$FULLNAME/ --incremental $BAKDIR_ADD
else
增量备份
ADDNAME=$(ls -lt $BAKDIR_ADD |sed -n 2p|awk '{print $9}')
$INNOBACKUPEX --defaults-file=$CONF --user=root --password=$PASSWD --incremental-basedir=$BAKDIR_ADD/$ADDNAME/ --incremental $BAKDIR_ADD
fi
else
echo "is not install innobackupex"
fi
mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的 数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。这时就 需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup。Xtrabackup实现是 物理备份,而且是物理热备 目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup;ibbackup是商 业软件,需要授权,非常昂贵。而xtrabackup功能比ibbackup还要强大,但却是开源的。因此我们这里就来介绍xtrabackup的使用。Xtrabackup提供了两种命令行工具:xtrabackup:专用于备份InnoDB和XtraDB引擎的 数据;innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备 份InnoDB,也可以备份MyISAM引擎的对象。
Xtrabackup是由percona提供的mysql数据库备份工具,特点:
(1)备份过程快速、可靠;
(2)备份过程不会打断 正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快。
[root@mysql ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz # 下载xtrabackup
#解压并进入目录复制
[root@mysql ~]# tar zxf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
[root@mysql ~]# cd percona-xtrabackup-2.4.4-Linux-x86_64/
[root@mysql percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/
[root@mysql percona-xtrabackup-2.4.4-Linux-x86_64]# ls bin/
Xtrabackup中主要包含两个工具:xtrabackup:是用于热备份innodb, xtradb表中数据的工具,支持在线热备 份,可以在不加锁的情况下备份Innodb数据表,不过此工具不能操作Myisam引擎表;innobackupex:是将 xtrabackup进行封装的perl脚本,能同时处理Innodb和Myisam,但在处理Myisam时需要加一个读锁。由于操 作Myisam时需要加读锁,这会堵塞线上服务的写操作,而Innodb没有这样的限制,所以数据库中Innodb表类 型所占的比例越大,则越有利。
#安装相关插件
[root@mysql ~]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perlTermReadKey.x86_64 perl-Digest-MD5
#下载percona-toolkit并安装
[root@mysql /]# wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/perconatoolkit-2.2.19-1.noarch.rpm
[root@mysql ~]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm
就这样,xtrabackup工具就安装好了,接下来就可以开始备份了
[root@mysql ~]# mkdir -p /opt/mysqlbackup/{
full,inc}
#full:全备存放的目录;inc:增量备份存放的目录
[root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /opt/mysqlbackup/full/
注:–defaults-file=/etc/my.cnf 指定mysql的配置文件my.cfg,如果指定则必须是第一个参数。/path/to/BACKUP-DIR/指定备份所存放的目标目录,备份过程会创建一个以当时备份时间命名的目录存放备份 文件。
出现如下图所示,则表示备份成功:
在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件:
[root@mysql ~]# cd /opt/mysqlbackup/full/
[root@mysql full]# ll
total 0
drwxr-x--- 6 root root 206 Jun 15 22:35 2020-06-15_22-35-02
[root@mysql full]# ll 2020-06-15_22-35-02/
total 12336
-rw-r----- 1 root root 425 Jun 15 22:35 backup-my.cnf
-rw-r----- 1 root root 338 Jun 15 22:35 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 15 22:35 ibdata1
drwxr-x--- 2 root root 4096 Jun 15 22:35 mysql
drwxr-x--- 2 root root 8192 Jun 15 22:35 performance_schema
drwxr-x--- 2 root root 8192 Jun 15 22:35 sys
drwxr-x--- 2 root root 50 Jun 15 22:35 test1
-rw-r----- 1 root root 113 Jun 15 22:35 xtrabackup_checkpoints
-rw-r----- 1 root root 459 Jun 15 22:35 xtrabackup_info
-rw-r----- 1 root root 2560 Jun 15 22:35 xtrabackup_logfile
各文件说明:
(1)xtrabackup_checkpoints ——备份类型(如完全或增量)、备份状态(如是否已经为prepared 状态)和LSN(日志序列号)范围信息; 每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是 整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事 件的位置。
(3)xtrabackup_binlog_pos_innodb ——二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前 position。
(4)xtrabackup_binary ——备份中用到的xtrabackup的可执行文件;
(5)backup-my.cnf ——备份命令用到的配置选项信息;
在使用innobackupex进行备份时,还可以使用–no-timestamp选项来阻止命令自动创建一个以时间命名的目 录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据
注意:相关选项说明: 其中,--user指定连接数据库的用户名,--password指定连接数据库的密码,-defaults-file指定数据库的配置文件,innobackupex要从其中获取datadir等信息;--database指定要备份 的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB 数据来说都是全备(所有数据库中的 InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样);/opt/mysqlbackup/full是备份 文件的存放位置。
注:备份数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份,则可基于如下 命令创建此类用户:
#创建用户
mysql> create user 'bkpuser'@'localhost' identified by '123456';
#回收用户所有权限
mysql> revoke all privileges,grant option from 'bkpuser'@'localhost';
#授权有关备份的相应权限
mysql> grant reload,lock tables,replication client, process on *.* to 'bkpuser'@'localhost';
mysql> flush privileges;
至此全备完全成功,然后向mysql某个库插入几条数据,然后进行增量备份 对完全备份的后数据库更改进行
#查看完全备份时binlog日志位置
[root@mysql full]# cat /opt/mysqlbackup/full/2020-06-15_22-49-41/xtrabackup_binlog_info
bin_log.000001 154
#模拟数据库修改:
mysql>select * from tb1;
+------+----------+--------+
| id | name | back |
|------+----------+--------|
| 1 | zhangsan | w |
| 2 | lisi | q |
| 3 | wangwu | e |
| 4 | zhaoliu | r |
| 5 | liuyi | t |
| 6 | didi | y |
+------+----------+--------+
6 rows in set
mysql>insert into tb1 values(7,'tom','u');
mysql>insert into tb1 values(8,'tom2','i');
[root@mysql data]# pwd
/usr/local/mysql/data
[root@mysql data]# mysqlbinlog -v bin_log.000001 # 可以通过mysqlbinlog二进制日志号
[root@mysql data]# cat /opt/mysqlbackup/full/2020-06-15_22-49-41/xtrabackup_binlog_info
bin_log.000001 154 # 后面这个154 就是开始
#由于我全备之后还做了一些操作,所以我这里并不是154
#增量备份二进制文件
[root@mysql data]# mysqlbinlog --start-position=219 /usr/local/mysql/data/bin_log.000001 > /opt/mysqlbackup/inc/`date +%F`.sql
[root@mysql data]# ls /opt/mysqlbackup/inc/
2020-06-15.sql
模拟数据库损坏, 我这里直接使用删除数据目录文件来模拟损坏。
[root@mysql ~]# rm -rf /usr/local/mysql/data/*
还原完全备份:
准备(prepare)一个完全备份 一般情况下,在备份完成后,数据尚且不能用于恢复操作, 因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文 件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得 数据文件处于一致性状态。在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而 不是回滚到xtrabackup刚开始时的点。
[root@mysql ~]# innobackupex --apply-log /opt/mysqlbackup/full/2020-06-15_22-49-41/
注:/opt/mysqlbackup/full/2020-06-15_22-49-41/ 备份文件所在目录名称 如果执行正确,其最后输出的几行信 息通常如下:
在实现“准备”的过程中,innobackupex通常还可以使用–use-memory选项来指定其可以使用的内存的大小,默 认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。innobackupex命令的–copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器 DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。
还原数据库语法:
[root@mysql ~]# innobackupex --copy-back /opt/mysqlbackup/full/2020-06-15_22-49-41/
这里的–copy-back指明是进行数据恢复。数据恢复完成之后,需要修改相关文件的权限mysql数据库才能正常启动。 如果执行正确,其输出信息的最后几行通常如下:
请确保如上信息的最行一行出现“completed OK!”。修改还原后的数据目录权限:
[root@mysql ~]# ll /usr/local/mysql/data/
total 122916
-rw-r----- 1 root root 357 Jun 15 23:36 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 15 23:36 ibdata1
-rw-r----- 1 root root 50331648 Jun 15 23:36 ib_logfile0
-rw-r----- 1 root root 50331648 Jun 15 23:36 ib_logfile1
-rw-r----- 1 root root 12582912 Jun 15 23:36 ibtmp1
drwxr-x--- 2 root root 4096 Jun 15 23:36 mysql
drwxr-x--- 2 root root 8192 Jun 15 23:36 performance_schema
drwxr-x--- 2 root root 8192 Jun 15 23:36 sys
drwxr-x--- 2 root root 50 Jun 15 23:36 test1
-rw-r----- 1 root root 504 Jun 15 23:36 xtrabackup_info
当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在 启动mysqld之前还需要事先修改数据文件的属主和属组。如:
[root@mysql ~]# chown -R mysql:mysql /usr/local/mysql/data/
[root@mysql ~]# ll /usr/local/mysql/data/
total 122916
-rw-r----- 1 mysql mysql 357 Jun 15 23:36 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Jun 15 23:36 ibdata1
-rw-r----- 1 mysql mysql 50331648 Jun 15 23:36 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Jun 15 23:36 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jun 15 23:36 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Jun 15 23:36 mysql
drwxr-x--- 2 mysql mysql 8192 Jun 15 23:36 performance_schema
drwxr-x--- 2 mysql mysql 8192 Jun 15 23:36 sys
drwxr-x--- 2 mysql mysql 50 Jun 15 23:36 test1
-rw-r----- 1 mysql mysql 504 Jun 15 23:36 xtrabackup_info
[root@mysql ~]# systemctl restart mysqld
#验证还原后的数据
mysql> select * from tb1;
+------+----------+------+
| id | name | back |
+------+----------+------+
| 1 | zhangsan | w |
| 2 | lisi | q |
| 3 | wangwu | e |
| 4 | zhaoliu | r |
| 5 | liuyi | t |
| 6 | didi | y |
+------+----------+------+
6 rows in set (0.00 sec)
还原增量备份: 为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原:
mysql> set sql_log_bin=0;
mysql> source /opt/mysqlbackup/inc/2020-06-15.sql
也可以在命令行执行如下语句
mysql –uroot –p < /opt/mysqlbackup/inc/2020-06-15.sql
mysqlbinlog /opt/mysqlbackup/inc/2020-06-15.sql | mysql –uroot -p
重新启动二进制日志并验证还原数据:
mysql> set sql_log_bin=1;
mysql> select * from tb1; # 可以看到两个tom已经回来了
+------+----------+------+
| id | name | back |
+------+----------+------+
| 1 | zhangsan | w |
| 2 | lisi | q |
| 3 | wangwu | e |
| 4 | zhaoliu | r |
| 5 | liuyi | t |
| 6 | didi | y |
| 7 | tom | u |
| 8 | tom2 | i |
+------+----------+------+
8 rows in set (0.00 sec)
前面我们进行增量备份时,使用的还是老方法:备份二进制日志。其实xtrabackup还支持进行增量备份。先介 绍下xtrabackup的备份原理 在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件 (transaction log,事务日志)。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB 会检查数据文件和事务日志,并执行两个步骤:它应用已经提交的事务日志到数据文件,并将修改过但没有提 交的数据进行回滚操作。xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文 件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这 时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持 续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开 始,就不停的将事务日志中每个数据文件的修改都记录下来。这就是xtrabackup的备份过程 所以每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础。xtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的 data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:
1.It applies committed transaction logentries to the data files
2.it performs an undo operation on anytransactions that modified data but did not commit. 所以在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery
准备测试环境,创建一个测试数据库,并创建一张表输入几行数据
mysql> create database test2;
mysql> use test2;
mysql> create table tab1(id int,name varchar(20));
mysql> insert into tab1 values(1,'tom1');
mysql> insert into tab1 values(2,'tom2');
[root@mysql ~]# xtrabackup --default-file=/etc/my.cnf --user=root --password="123" --port=3306 --backup --target-dir=/opt/mysqlbackup/full/full_incre_$(date+%Y-%m-%d_%H:%M:%S)
#查看完全备份文件
[root@mysql ~]# ls /opt/mysqlbackup/full/ -l
total 0
drwxr-x--- 6 root root 288 Jun 15 23:33 2020-06-15_22-49-41
drwxr-x--- 7 root root 249 Jun 15 23:56 full_incre_
#xtrabackup进行增量备份 先录入些数据,实现第一次增量数据:
mysql> use test2;
mysql> insert into tab1 values(3,'tom3');
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password="123" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/full/full_incre_
#查看增量备份文件:
[root@mysql ~]# ls -l /opt/mysqlbackup/inc/
total 8
drwxr-x--- 7 root root 275 Jun 16 00:04 incre_20200616_000403
#这里的增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。
#向表中再插入几行数据,继续第二次增量备份
mysql> insert into tab1 values (4,'tom4');
mysql> commit;
#接下来进行第二次增量备份
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password="123" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/inc/incre_20200616_000403
如下图所示:
注:第二次增量备份–incremental-basedir指向上一次增量备份文件的位置。注:第二次增量备份–incremental-basedir指向上一次增量备份文件的位置。注:第二次增量备份–incremental-basedir指向上一次增量备份文件的位置。
#查看增量备份文件
[root@mysql ~]# ls -l /opt/mysqlbackup/inc/
total 8
drwxr-x--- 7 root root 275 Jun 16 00:04 incre_20200616_000403
drwxr-x--- 7 root root 275 Jun 16 00:08 incre_20200616_000826
mysql> delete from tab1 where id=3;
完整备份恢复:在进行恢复前,如果完整备份在远程主机上,首先将完整备份复制到本地主机上,如果是tar 包,则需要先解包,解包命令为:tar –izxf xxx.tar,这里必须使用-i参数(忽略存档中的 0 字节块(通常意味着 文件结束))。
开始全备份恢复 :
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_/
恢复成功如图所示:
恢复到第一次增量的时刻 增量备份恢复的步骤和完整备份恢复的步骤基本一致,只是应用日志的过程稍有不 同。增量备份恢复时,是先将所有的增量备份挨个应用到完整备份的数据文件中,然后再将完整备份中的数据 恢复到数据库中。
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_000403/
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_000826/
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --target-dir=/opt/mysqlbackup/full/full_incre_/
[root@mysql ~]# systemctl stop mysqld
开始rsync同步数据文件:
[root@mysql full_incre_]# rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /usr/local/mysql/data/
#当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在 启动mysqld之前还需要事先修改数据文件的属主和属组。
[root@mysql data]# ll
total 122972
-rw-r----- 1 mysql mysql 56 Jun 15 23:38 auto.cnf
-rw-r----- 1 root root 425 Jun 15 23:56 backup-my.cnf
-rw-r----- 1 mysql mysql 177 Jun 15 23:38 bin_log.000001
-rw-r----- 1 mysql mysql 177 Jun 15 23:40 bin_log.000002
-rw-r----- 1 mysql mysql 1847 Jun 16 00:42 bin_log.000003
-rw-r----- 1 mysql mysql 111 Jun 15 23:41 bin_log.index
-rw-r----- 1 root root 298 Jun 15 23:56 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 16 00:19 ibdata1
-rw-r----- 1 root root 50331648 Jun 16 00:19 ib_logfile0
-rw-r----- 1 root root 50331648 Jun 16 00:19 ib_logfile1
-rw-r----- 1 root root 12582912 Jun 16 00:19 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Jun 16 00:18 mysql
-rw-r----- 1 mysql mysql 22460 Jun 16 00:42 mysql.err
drwxr-x--- 2 mysql mysql 8192 Jun 16 00:18 performance_schema
drwxr-x--- 2 mysql mysql 8192 Jun 16 00:18 sys
drwxr-x--- 2 mysql mysql 50 Jun 16 00:18 test1
drwxr-x--- 2 mysql mysql 52 Jun 16 00:18 test2
-rw-r----- 1 root root 20 Jun 16 00:18 xtrabackup_binlog_info
-rw-r--r-- 1 root root 20 Jun 16 00:19 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root 628 Jun 16 00:18 xtrabackup_info
[root@mysql data]# chown -R mysql:mysql /usr/local/mysql/data/
[root@mysql data]# systemctl restart mysqld
mysql> select * from tab1;
+------+------+
| id | name |
+------+------+
| 1 | tom1 |
| 2 | tom2 |
| 3 | tom3 |
| 4 | tom4 |
+------+------+
测试环境准备创建一个测试数据库,并创建一张表输入几行数据
mysql> create database test3;
mysql> use test3;
mysql> create table tab1(id int,name varchar(20));
mysql> insert into tab1 values(1,'lisi1');
mysql> insert into tab1 values(2,'lisi2');
1、innobackupex先做完全备份
[root@mysql data]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123" /opt/mysqlbackup/full/full_incre_$(date +%Y%m%d_%H%M%S) --no-timestamp
#查看完全备份文件
[root@mysql data]# ls /opt/mysqlbackup/full/
full_incre_20200616_005156
做第一次增量备份 先录入增量数据
mysql> insert into tab1 values(3,'lisi3');
#进行增强备份
[root@mysql data]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/full/full_incre_20200616_005156 --user=root --password="123" --no-timestamp
#查看增量备份文件
[root@mysql data]# ll /opt/mysqlbackup/inc/
drwxr-x--- 8 root root 288 Jun 16 00:56 incre_20200616_005610
基于全备和第一个增量备份来做第二次增量备份 先录入增量数据录入
mysql> insert into tab1 values(4,'lisi4');
[root@mysql inc]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/inc/incre_20200616_005610/ --user=root --password="123" --no-timestamp
#查看增量备份文件
[root@mysql inc]# ll
total 8
drwxr-x--- 8 root root 288 Jun 16 00:56 incre_20200616_005610
drwxr-x--- 8 root root 288 Jun 16 01:03 incre_20200616_010301
#**先删除两次增量数据,用来查看验证恢复结果**
mysql> delete from tab1 ;
#开始做恢复,恢复全备份
[root@mysql inc]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_20200616_005156/
#--redo-only 用于准备增量备份内容把数据合并到全备份目录,配合incremental-dir 增量备份目录使用
#基于全备份进行第一次增量备份的恢复
[root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_20200616_005156/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_005610/
#基于全备份和第一次增量备份,恢复第二次增量备份
[root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_20200616_005156/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_010301/
#停止数据库
[root@mysql ~]# systemctl stop mysqld
#清空数据目录下所有文件
[root@mysql ~]# mkdir -p /tmp/mysqldatabak
[root@mysql ~]# mv /usr/local/mysql/data/* /tmp/mysqldatabak/
#将恢复好的数据按照配置文件的需求拷贝到相应目录
[root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123" --copy-back /opt/mysqlbackup/full/full_incre_20200616_005156/
#当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在 启动mysqld之前还需要事先修改数据文件的属主和属组
[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# ll
total 12328
-rw-r----- 1 root root 298 Jun 16 01:12 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 16 01:12 ibdata1
drwxr-x--- 2 root root 4096 Jun 16 01:12 mysql
drwxr-x--- 2 root root 8192 Jun 16 01:12 performance_schema
drwxr-x--- 2 root root 8192 Jun 16 01:12 sys
drwxr-x--- 2 root root 50 Jun 16 01:12 test1
drwxr-x--- 2 root root 52 Jun 16 01:12 test2
drwxr-x--- 2 root root 52 Jun 16 01:12 test3
-rw-r----- 1 root root 20 Jun 16 01:12 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root 598 Jun 16 01:12 xtrabackup_info
[root@mysql data]# chown -R mysql:mysql /usr/local/mysql/data/
#启动服务
[root@mysql data]# systemctl restart mysqld
登录mysql界面,查看数据是否已经恢复
mysql> select * from tab1;
+------+-------+
| id | name |
+------+-------+
| 1 | lisi1 |
| 2 | lisi2 |
| 3 | lisi3 |
| 4 | lisi4 |
+------+-------+
4 rows in set (0.00 sec)
Xtrabackup的“流”及“备份压缩”功能 Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过 STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用-stream选项即可。
# innobackupex --user=root --password="123" --stream=tar /opt/mysqlbackup/full/ | gzip >/opt/mysqlbackup/full/full_`date +%F_%H%M%S`.tar.gz
1.异地备份的话,需要做ssh免密登录
在MySQL服务器上操作
ssh-keygen
ssh-copy-id root@192.168.1.4
#!/bin/bash
#Mysql dabase information
#主机
find /aebiz/soft/databackup/* -type f -mtime +10 -name "*.gz" -exec rm {} \;
db_host="localhost"
#数据库帐号
db_user="root"
#数据库密码
db_passwd="123456"
#mysql安装目录
MYSQL="/aebiz/soft/mysql"
#mysql命令目录
MYSQLDUMP="/aebiz/soft/mysql/bin/mysqldump"
#Path information
#存放备份文件的路径
BACKUP_DB="/aebiz/soft/databackup"
LogFile=$BACKUP_DB"/bak.log"
#Time information
#时间
time=`date +"%Y-%m-%d-%H-%M-%S"`
day=`date +"%d"`
month=`date +"%Y-%m"`
weekday=`date +"%u"`
#Path enable write
if [ ! -w "$BACKUP_DB" ]; then
chmod -R 700 $BACKUP_DB
fi
#echo "**********************************host info****************************************"
#echo "db_host:"$db_host
#echo "db_user:"$db_user
#echo "db_passwd:"$db_passwd
#echo "MYSQL:"$MYSQL
#echo "MYSQLDUMP:"$MYSQLDUMP
#echo "databaseName:"$databaseName
#echo "BACKUP_DB:"$BACKUP_DB
#echo "**********************************************************************************"
#Mysql Backup
Date=`date +%Y%m%d`
Begin=`date +"%Y-%m-%d %H:%M:%S"`
#echo "start backup database:"$databaseName" "$Begin
#databases
#需要备份的数据库,如果有多个数据库,请用,分隔
databaseList="ceshishop,ceshiydys,testshop0711,testydys0711"
for databaseName in `echo "$databaseList" | sed 's/,/\n/g'`
do
echo $databaseName
#fileName
#生成备份文件名
fileName=$databaseName"-"$time".sql"
#生成备份文件完整路径
BACKUP_DBPATH=$BACKUP_DB"/"$databaseName
#echo "***********************************database Info***********************************************"
#echo "BACKUP_DBPATH:"$BACKUP_DBPATH
#echo "fileName:"$fileName
#echo "**********************************************************************************"
if [ ! -d "$BACKUP_DBPATH" ]; then
mkdir "$BACKUP_DBPATH"
fi
#备份mysql
$MYSQLDUMP -u $db_user -p$db_passwd -h $db_host $databaseName > $BACKUP_DBPATH/$fileName
#打包.sql文件
cd $BACKUP_DBPATH && tar -czf $fileName.tar.gz $fileName && rm -rf $fileName && chmod go-rwx $fileName.tar.gz
Last=`date +"%Y-%m-%d %H:%M:%S"`
#echo "end backup database:"$databaseName" "$Last
#输出日志
echo start:$Begin end:$Last $fileName succ >> $LogFile
done
scp -r /aebiz/soft/databackup [email protected]:/aebiz/soft
每隔三天的凌晨三点,执行备份
0 3 */3 * * sh /aebiz/soft/databasebak.sh
备份服务器的可以设置保留时间长一些,删除30天前的备份
每隔三天查找备份目录下超过三十天的文件并删除.
0 3 */3 * * find /aebiz/soft/databackup/* -type f -mtime +30 -name "*.gz" -exec rm {} \;
1.备份脚本如下:
#!/bin/bash
#备份存放的路径
backup_dir="/backup/mysql/full"
#备份用户
mysql_user="root"
#备份密码
mysql_passwd="password"
#备份记录日志
log="./mysql_backup.log"
[ -d $backup_dir ] || mkdir -p $backup_dir
function backup_mysql_full(){
#1.全量备份,在full目录生成一个以日期命名的备份文件夹
echo "Start to backup at `date +"%Y-%m-%d %H:%M:%S"`">>$log
innobackupex --user=$mysql_user --password=$mysql_passwd $backup_dir
if [ $? -eq 0 ];then
echo "Backup success at "`date +"%Y-%m-%d %H:%M:%S"`>>$log
#删除1天前的备份
find $backup_dir -type d -mtime +7|xargs rm -rf >>$log
else
echo "Backup fail at "`date +"%Y-%m-%d %H:%M:%S"`>>$log
fi
}
backup_mysql_full
2.添加定时备份,每天凌晨2点开始自动备份。
crontab -e
00 02 * bash /opt/xtrabackup_scripts/backup_mysql_full.sh
说明:前提需安装xtrabackup备份工具,一款物理备份,速度相比mysqldump的逻辑备份快很多。
1.属于物理热备,速度快,不影响业务。
2.定时自动备份
3.自动保留7天的备份,并删除旧备份,防止磁盘占满
4.备份日志记录,备份失败或没有备份方便查找原因
5.全库备份
#!/bin/bash
# 使用方法 先删除数据rm -rf /data/mysqldata/, 然后 sh recover_mysql_full.sh 2018-08-08_16-33-07
#恢复的目标库的用户名
mysql_user="root"
#恢复的目标库的密码
mysql_passwd="password"
#备份文件存放的目录
mysql_recover_dir="/backup/mysql/full"
#恢复的目标库数据库文件路径
mysql_dir="/data/mysqldata/"
#目标库的数据配置文件
my_cnf="/etc/my.cnf"
#日志记录
log="./mysql_recover.log"
#自动创建恢复目录
[ -d $mysql_recover_dir ] || mkdir -p $mysql_recover_dir
#备份数据数据中可能包含未提交的事务或已经提交但未同步至数据文件中的事务,此时数据还处于不一致状态。因此需要通过回滚未提交的事务及已经提交的事务至数据文件,使得数据文件
处于一致性状态
innobackupex --defaults-file=$my_cnf --user=$mysql_user --password=$mysql_passwd --apply-log $mysql_recover_dir/$1
#开始真正的恢复数据
service mysqld stop
rm -rf $mysql_dir/* >>$log
innobackupex --defaults-file=$my_cnf --user=$mysql_user --password=$mysql_passwd --copy-back $mysql_recover_dir/$1>>$log
chown mysql.mysql -R $mysql_dir >>$log
service mysqld start
[ $? -ne 0 ] && service mysqld start
此恢复脚本可以和备份脚本组合在一起,加个定时任务,就可以做每天定时同步生产数据到测试环境。对于数据量几十上百G不大的情况挺实用。当然,如果数据量很大,300G以上则需要用到otter,数据的消费和订阅,后面会讲到此方案,强大到能实时同步跨国家、跨地区的数据实时同步。
很多时候我们数据出了问题,并不想直接还原到原先的库,毕竟数据缺少一天的。还原直接损失一天的数据,因此我们想还原到别的地方做对比看看,现准备好新搭建的一台数据库。
1.恢复数据前的准备(合并xtabackup_log_file和备份的物理文件),应用备份文件
innobackupex —apply-log /backup/mysql/full/2019-01-02_02-00-02
2.删除原先数据库里的数据
service mysqld stop
cd /var/lib/mysql/
rm -rf *
3.恢复
innobackupex —copy-back /backup/mysql/full/2019-01-02_02-00-02
chown -R mysql.mysql /var/lib/mysql/
service mysqld restart
最后查看新数据库已有原来的数据。
参考链接 :
MySQL增量备份脚本 :https://www.jianshu.com/p/8455d061a1e7
Mysql备份 https://mp.weixin.qq.com/s/SBiKqZXe1K-bjHiuKQLSVA
xtrabackup 实现MySQL数据库备份 :https://mp.weixin.qq.com/s/fL8Mp0hM-rzyPXjDUFZP-Q
原创地址:https://blog.51cto.com/14227204/2504847
原创作者:张九冫
MySQL备份脚本及异地备份: https://www.jianshu.com/p/32663e2857cf
mysql的备份和恢复 :https://mp.weixin.qq.com/s/HVwWb9v8O9b7FTFRwf8q6g