数据库的备份与恢复
> 备份策略:
>
> 完全备份、差异备份、增量备份
>
> 备份方式
>
> 冷备份:
> 数据库服务处于停止状态下完成数据备份
>
> 温备份:
> 数据库运行状态下完成数据备份,但数据库的写操作会被阻塞
>
> 热备份:
> 在运行状态下完成数据备份,数据库的读写操作不受影响

#### 一、完全备份与恢复
##### 备份
停止数据库服务,为了保证数据的统一性、完整性
物理备份:cp/tar/zip将数据库文件:/var/lib/mysql/*转到备份机
>物理备份跨平台性差,备份时间长、冗余备份浪费存储空间
>
>使用mysqldump备份:效率低,备份与还原慢,锁表导致备份时数据插入与更新被阻塞
```shell
echo
#备份单张表
mysqldump -uroot -pa tarena salary > /backdir/tarena_salary.sql
#备份多张表
mysqldump -uroot -pa tarena departments employees > /backdir/tarena_de.sql
#备份单个库
mysqldump -uroot -pa -B tarena > /backdir/tarena.sql
#备份多个库
mysqldump -uroot -pa -B studb db1> /backdir/studb_db1.sql
#备份整个mysql
mysqldump -uroot -pa -A > /backdir/allback.sql
scp /backdir/*.sql [email protected]:/root
> backup.sh
```
##### 恢复
```shell
#导入一个库
mysql -uroot -pa < tarena.sql
#导入一张表
mysql -uroot -pa tarena < tarena_salary.sql
```
#### 二、增量备份与恢复
##### percona备份工具
> 安装前置软件包:perl**-**DBD**-**MySQL
>
> 将本地percona传到实验机,解压,移动至/usr/local/percona
>
> 在/etc/bashrc中添加环境变量:
> export PATH=/usr/local/percona/bin/:$PATH
> source /etc/bashrc #更新环境变量
> xtrabackup -v #验证安装
##### 备份
```shell
# 第一次完整备份
xtrabackup --host=127.0.0.1 --user=root --password=a --datadir=/var/lib/mysql --backup --target-dir=/fullback
# 第二次增量备份(参考第一次备份)
xtrabackup --host=127.0.0.1 --user=root --password=a --datadir=/var/lib/mysql --backup --incremental-basedir=/fullback --target-dir=/fullback-new1
# 第三次增量备份(参考第二次备份)
xtrabackup --host=127.0.0.1 --user=root --password=a --datadir=/var/lib/mysql --backup --incremental-basedir=/fullback-new1 --target-dir=/fullback-new2
#...
```
##### 恢复
> 恢复sql先整合备份后恢复备份
> 加载方式:加载完整备份再逐个加载增量备份,逐个增加是基于指针to_lsn
>
> 查看指针:/备份数据路径/xtrabackup_checkpoints
> 着重注意:from_lsn与to_lsn,增量备份的from_lsn延续上一次备份的to_lsn
> 其次backup_type:完整备份是full-backuped,增量备份是incremental
```shell
#将备份文件传给数据库服务器
#编写备份整合脚本
xtrabackup --prepare --apply-log-only --target-dir=/opt/fullback &> /dev/null
for i in {1..7}
do
xtrabackup --prepare --apply-log-only --target-dir=/opt/fullback --incremental-dir=/opt/fullback-new$i &> /dev/null
done
#停止服务,删除数据文件
# 恢复备份
xtrabackup --copy-back --target-dir=/opt/fullback
# 注意恢复后会有归属问题
chown -R mysql:mysql /var/lib/mysql
#启动服务
```
#### 三、差异备份与恢复
> 差异备份类似增量备份,都有完整、增量也都有指针指向,不同点在于在整合备份时只需要第一次完整备份和最后一次增量备份
##### 备份
```shell
#第一次完整备份
xtrabackup --host=127.0.0.1 --user=root --password=a --datadir=/var/lib/mysql --backup --target-dir=/allback
#...
#最后一次增量备份
xtrabackup --host=127.0.0.1 --user=root --password=a --datadir=/var/lib/mysql --backup --incremental-basedir=/allback --target-dir=/allback-increase6 &> /dev/null
```
##### 恢复
```shell
#将备份文件传给数据库服务器
#第一次完整备份
xtrabackup --prepare --apply-log-only --target-dir=/opt/allback
#最后一次增量备份
xtrabackup --prepare --apply-log-only --target-dir=/opt/allback --incremental-dir=/opt/allback-increase6
#停止服务,删除数据文件
# 恢复备份
xtrabackup --copy-back --target-dir=/opt/allback
# 注意恢复后会有归属问题
chown -R mysql:mysql /var/lib/mysql
#启动服务
```
#### 四、实时备份与恢复(binlog日志)
> mysql——5版本默认不开启binlog日志,需要手动开启
binlog日志会生成二进制文件,属于mysql服务日志的一部分,保存所有写操作sql命令
单个binlog日志文件最大1G,会生成一个新的日志文件记录
在刷新中除了这个机制还有另外三个方法使binlog在不满足1G的情况下生成一个新的日志文件记录
#手动刷新日志
mysql -e "flush logs;"
#备份文件
mysqldump --flush-logs mysql user > user.sql
#重启服务
systemctl restart mysqld
当日志文件在30天没有使用时,会自动删除
```mysql
#当前所有的binlog日志
SHOW BINARY LOGS;
#当前正在使用的binlog日志
SHOW MASTER STATUS;
/*验证binlog写操作增长
SHOW DATABASES;
SHOW MASTER STATUS;
SELECT * FROM tarena.salary;
SHOW MASTER STATUS;
CREATE DATABASE db2;
SHOW MASTER STATUS;
CREATE TABLE db1.user(name char(10));
SHOW MASTER STATUS;*/
#清理所有日志
mysql -e "reset master"
#在mysql中标准清理binlog日志
mysql -e "purge master logs to 'binlog.000002'" #清理目标(02)以前的日志
修改logbin配置项:/etc/my.cnf.d/mysql-server.cnf #注意修改所属(元数据)
```
> stat命令:可以查看一个文件的详细信息,以及各种时间信息
----------------------------------------------------------------------------------------------------------------------
