mysql5.7系列教程(五)备份恢复

命令详解-binlog

查看数据库binlog列表

mysql> show binary logs;  
mysql> show master logs;

查看当前使用的binlog文件信息。

mysql> show binlog events \g;  

查看指定的binlog文件信息。

mysql> show binlog events in 'mysql-bin.000005'; 

查看文件内容

shell> mysqlbinlog binlog.0000003

将内存中log日志写磁盘,保存在当前binlog文件中,并产生一个新的binlog日志文件。

mysql>flush logs;  

#删除所有二进制日志,并重新(mysql-bin.000001)开始记录。

mysql>flush logs; reset master;  

自动二进制日志文件删除的天数。默认值为0,表示“ 不自动删除”

mysql> show variables like 'expire_logs_days';

设置过期天数

mysql> set global expire_logs_days=7;

在这里插入图片描述
查看binlog详情

 mysql> show variables like 'log_bin%';

备份策略

1.开启log
在这里插入图片描述
备份
【使用mysql_config_editor处理密码后,这里就不用密码了】

shell> mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases > backup_sunday_1_PM.sql

mysqldump–single-transaction(执行不对表进行锁定的联机备份)可以保证mysqldump的读一致性。就算数据被其他应用修改,mysqldump也不会读入。—single-transaction只在innodb上有效。
–flush-logs 服务器刷新其日志。
–master-data=2 将二进制文件输出,执行此命令后,数据目录包含一个新的二进制日志文件:
– Position to start replication or point-in-time recovery from
– CHANGE MASTER TO MASTER_LOG_FILE=‘gbichot2-bin.000007’,MASTER_LOG_POS=4;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases --delete-master-logs > backup_sunday_1_PM.sql

–delete-master-logs删除不再需要的二进制日志
注意(除了当前使用的都会删除):
如果有配置复制的情况下使用—delete-master-logs很危险。可能出现还没有被复制到slave的日志被删除。

恢复(之前的已经恢复了,之后的数据从二进制文件恢复)
#mysql < backup_sunday_1_PM.sql
将二进制文件中的数据保存到文件
mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql

备份策略总结

系统crash或者断电,innodb会自己修复,但是为了安全性考虑:
1.确定已经启动了binary log
2.定期的做全备
3.定期的做增量备份

mysqldump

#mysqldump --all-databases > dump.sql           备份所有库
#mysqldump --databases db1 db2 db3 > dump.sql   备份指定库
#mysqldump --databases test > test.sql

上述两个命令之间的区别在于,没有–databases,转储输出不包含CREATE DATABASE或USE 语句。这有几个含义:
1.重新加载转储文件时,必须指定默认数据库名称,以便服务器知道要重新加载的数据库。
2.要重新加载,您可以指定与原始名称不同的数据库名称,这样可以将数据重新加载到其他数据库中。
3.如果要重新加载的数据库不存在,则必须先创建它。
4.因为输出将不包含任何 CREATE DATABASE语句,所以该–add-drop-database 选项不起作用。如果你使用它,它不会产生任何 DROP DATABASE声明。

mysqldump test t1 t3 t7 > dump.sql   导出指定的表

导入

# mysql < test.sql     or       mysql> source test.sql

在这里插入图片描述
使用mysqldump将数据以分隔文本格式转储
重要参数:

show global variables like '%secure%';

在这里插入图片描述
当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/var/lib/mysql-files/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
再mysql.cnf中的[mysqld]加入secure_file_priv =
再重启mysql服务 可以取消限制

以下命令将db1数据库的内容转储到 数据库中的文件 /var/lib/mysql-files/

#mysqldump --tab=/var/lib/mysql-files/db1

The .txt files containing table data are written by the server, so they are owned by the system account used for running the server. The server uses SELECT … INTO OUTFILE to write the files, so you must have the FILEprivilege to perform this operation, and an error occurs if a given .txt file already exists.
要重新加载表,首先将位置更改为输出目录。

# mysql db1 < t1.sql
# mysqlimport db1 t1.txt

二进制日志的时间点(增量)恢复

要查看所有二进制日志文件的列表,
mysql> SHOW BINARY LOGS;
要确定当前二进制日志文件的名称
mysql> SHOW MASTER STATUS;
导入多个二进制文件
#mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
另一种方法是将所有日志写入单个文件,然后处理该文件:
# mysqlbinlog binlog.000001 >  /tmp/statements.sql
# mysqlbinlog binlog.000002 >> /tmp/statements.sql
# mysql -u root -p -e "source /tmp/statements.sql
指定时间
# mysqlbinlog --stop-datetime="2005-04-20 9:59:59" \
         /var/log/mysql/bin.123456 | mysql -u root -p
# mysqlbinlog --start-datetime="2005-04-20 10:01:00" \
         /var/log/mysql/bin.123456 | mysql -u root -p

要使用这种时间点恢复方法,您应该检查日志以确保为命令指定的确切时间。要在不执行的情况下显示日志文件内容,请使用以下命令:
mysqlbinlog /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
使用事件位置的时间点
–start-position和 --stop-position选项 可用于指定日志位置。它们的工作方式与启动和停止日期选项相同,只是指定日志位置数字而不是日期。使用位置可能会使您更准确地了解日志的哪个部分进行恢复,特别是如果许多事务发生在与SQL语句相同的时间内。要确定位置号码,请在执行不需要的事务的时间范围内运行 mysqlbinlog,但将结果重定向到文本文件进行检查。这可以这样做:

# mysqlbinlog --start-datetime="2005-04-20 9:55:00" \
         --stop-datetime="2005-04-20 10:05:00" \
         /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
位置被标记为 log_pos后跟一个数字。
# mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \
         | mysql -u root -p

# mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \
         | mysql -u root -p

xtrabackup

Percona XtraBackup是全球唯一的开源免费MySQL热备份软件,可以为InnoDB和XtraDB 数据库执行无阻塞备份:
 在不暂停数据库的情况下创建热备份的InnoDB备份
 进行MySQL的增量备份
 将压缩的MySQL备份传输到另一台服务器
 在MySQL服务器之间移动表格
 轻松创建新的MySQL复制从站
 在不增加服务器负载的情况下备份MySQL
在这里插入图片描述

https://www.percona.com/downloads/XtraBackup/LATEST/
获取,安装 yum源
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

wget http://www.percona.com/downloads/percona-release/redhat/0.1-4/
percona-release-0.1-4.noarch.rpm
rpm -ivH percona-release-0.1-4.noarch.rpm

–安装默认版本
yum -y install percona-xtrabackup
–安装注定版本
yum -y install percona-xtrabackup-24
–卸载
yum remove percona-xtrabackup

备份用户权限:(如果不指定用户默认为当前用户)

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'MyNewPass4!';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO
       'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

参数配置(/etc/my.cnf)

[xtrabackup]
target_dir = /home/xtrabackup/base/

完整备份

【如果InnoDB数据和log文件不在同一个位置,需要指定他们的目录。】

xtrabackup --backup --target-dir=/home/xtrabackup/base/

该 xtrabackup二进制写入一个名为xtrabackup_checkpoints到备份的目标目录。这个文件包含一行显示 to_lsn,这是备份结束时数据库的LSN

增量备份

The xtrabackup --prepare step for incremental backups is not the same as for full backups. In full backups, two types of operations are performed to make the database consistent: committed transactions are replayed from the log file against the data files, and uncommitted transactions are rolled back. You must skip the rollback of uncommitted transactions when preparing an incremental backup, because transactions that were uncommitted at the time of your backup may be in progress, and it’s likely that they will be committed in the next incremental backup. You should use the xtrabackup --apply-log-only option to prevent the rollback phase

--完整备份
xtrabackup --backup --target-dir=/home/xtrabackup/base
--完整备份的基础上创建增量备份
xtrabackup --backup --target-dir=/home/xtrabackup/inc1 --incremental-basedir=/home/xtrabackup/base
--增量备份的基础上创建增量备份(注意:增量备份目录不能在完整备份里面,建议同级,不然应用时会报错)
xtrabackup --backup --target-dir=/home/xtrabackup/inc2 --incremental-basedir=/home/xtrabackup/inc1
(应用备份)
xtrabackup --prepare --apply-log-only --target-dir=/home/xtrabackup/base
将第一次增量备份应用到完全备份
xtrabackup --prepare --apply-log-only --target-dir=/home/xtrabackup/base --incremental-dir=/home/xtrabackup/inc1
将第二次增量备份应用到完全备份
xtrabackup --prepare --target-dir=home/xtrabackup/base --incremental-dir=/home/xtrabackup/inc2
--之后可用于恢复

压缩备份

--压缩
xtrabackup --backup --compress --target-dir=/home/xtrabackup/compressed/
--多进程
xtrabackup --backup --compress --compress-threads=4 \
--target-dir=/home/xtrabackup/compressed/
--解压
xtrabackup --decompress --target-dir=/home/xtrabackup/compressed/
--准备
xtrabackup --prepare --target-dir=/home/xtrabackup/compressed/

加密、解密

使用encrypt-key
--获取encrypt-key
openssl rand -base64 24
xtrabackup --backup --target-dir=/home/xtrabackup --encrypt=AES256 \
--encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs"
使用encrypt-key-file
echo –n "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /data/backups/keyfile
xtrabackup --backup --target-dir=/home/xtrabackup/ --encrypt=AES256 \
--encrypt-key-file=/data/backups/keyfile
解密
xtrabackup --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" --target-dir=/home/xtrabackup/
--删除加密文件
xtrabackup --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" -target-dir=/home/xtrabackup/ --remove-original
准备
xtrabackup --prepare --target-dir=/home/xtrabackup/

恢复

恢复【datadir在恢复备份之前必须为空,并且需要关闭服务】
--停止服务
systemctl stop mysqld
--删除数据目录
rm -rf /var/lib/mysql/*
--恢复
xtrabackup --copy-back --target-dir=/home/xtrabackup/base/
xtrabackup --move-back --target-dir=/home/xtrabackup/base/
rsync -avrP /home/xtrabackup/backups/ /var/lib/mysql/
修改文件权限:
chown -R mysql:mysql /var/lib/mysql
--启动服务
systemctl start mysqld

innobackupex

is the symlink for xtrabackup. innobackupex still supports all features and syntax as 2.2 version did, but is now deprecated and will be removed in next major release.
全库备份
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
会创建一个带时间戳的目录/path/to/BACKUP-DIR/2013-03-25_00-00-09
--no-timestamp 不创建时间戳目录   
--defaults-file=/tmp/other-my.cnf   --指定配置文件(必须放在第一位)
准备数据
innobackupex --apply-log /path/to/BACKUP-DIR
--使用更多内存来加速
innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR
恢复
innobackupex --copy-back /path/to/BACKUP-DIR
chown -R mysql:mysql /var/lib/mysql

发布了52 篇原创文章 · 获赞 2 · 访问量 6375

猜你喜欢

转载自blog.csdn.net/wenwang3000/article/details/99477180