防止因为系统或者人为的错误操作删除或损坏数据
1.数据的一致性
2.数据的可用性
1.逻辑备份/热备份
备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
mysqldump,mydumper
效率相对较低
2.物理备份/冷备份
直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
tar,cp,scp跨设备复制文件
拷贝数据, 优点快,缺点服务停止。
完全备份
基础
增量备份
连续回复
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
差异备份
跳跃恢复
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后 一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。
Percona XtraBackup公司是一个开源的热备份实用程序,用于MySQL数据库-基于服务器,在备份期间不会锁定数据库。
安装YUM仓库
安装percona需要的mysql包
mysql官方源
yum install -y https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
查看mysql可用版本
yum repolist all | grep mysql
禁用80
yum-config-manager --disable mysql80-community
启用57
yum-config-manager --enable mysql57-community
yum install mysql-community-libs-compat -y
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
innobackupex --user=root --password=‘QianFeng@123’ /xtrabackup/full
连接数据库,开始备份。
请注意备份结果是否完成
观看二进制日志位置
ls /xtrabackup/full/2020-08-28_19-22-06/xtrabackup_binlog_info
这里没有的原因是二进制文件默认未开启
添加命令手动开启
vim /etc/my.cnf
log_bin
添加该字段。指启动二进制日志
server-id=2
群集问题,必须指定该主机的序号。数字随意
重启服务后重新备份文件
|
停止数据库
systemctl stop mysqld
清理环境(模拟损坏)
rm -rf /var/lib/mysql/*
rm -rf /var/log/mysqld.log
生成回滚日志
innobackupex --apply-log /xtrabackup/full/2017-08-01_00-00-18/
指定备份点
恢复文件
innobackupex --copy-back /xtrabackup/full/2017-08-01_00-00-18/
登陆验证
ls /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p’QianFeng@123’
使用指定的数据库
create database testdb;
use testdb;
create table test(id int);
insert into test values (1);
select * from test;
mysql> select * from test;
rm -rf /xtrabackup/*
date 09010000
时间建议靠后设置。
innobackupex --user=root --password=‘QianFeng@123’ /xtrabackup
ll /xtrabackup/
2017-09-01_00-00-04
请问数据库中的记录是多少?
1
date 09020000
更新时间
mysql -uroot -p’QianFeng@123’ -e ‘insert into testdb.test values (2)’
插入数据,区别周一
mysql -uroot -p’QianFeng@123’ -e ‘select * from testdb.test’
不进入数据库查看结构
innobackupex --user=root --password=‘QianFeng@123’
–incremental /xtrabackup/
–incremental-basedir=/xtrabackup/2017-09-01_00-00-04
basedir基于周一的备份。
会生成一个今天的。
ls /xtrabackup/
date 09030000
mysql -uroot -p’QianFeng@123’ -e ‘insert into testdb.test values (3)’
innobackupex --user=root --password=‘QianFeng@123’
–incremental /xtrabackup/
–incremental-basedir=/xtrabackup/2017-09-02_00-00-26
basedir基于周2的备份。
会生成一个今天的。
停止数据库
systemctl stop mysqld
清理环境
rm -rf /var/lib/mysql/*
周一
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
回滚合并
周二
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
–incremental-dir=/xtrabackup/2017-09-02_00-00-26
将周二的增量备份数据添加到完整备份中
此时恢复的数据只是周二的数据,周三的数据还未复制到完整备份中
innobackupex --copy-back /xtrabackup/2017-09-01_00-00-06
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p’QianFeng@123’ -e ‘select * from testdb.test’
想回复3,怎么办
systemctl stop mysqld
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
–incremental-dir=/xtrabackup/2017-09-03_00-00-27
# rm -rf /var/lib/mysql/*
innobackupex --copy-back /xtrabackup/2017-09-01_00-00-04
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p’QianFeng@123’ -e ‘select * from testdb.test’
1 自动记录日志position位置。
(show master status\G;)
2 可用性,一致性
锁表机制。
mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
参数说明
库的范围
-A, --all-databases 所有库
school 数据库名
school stu_info t1 是指school数据库的表stu_info、t1
-B, --databases bbs test mysql 多个数据库
–single-transaction #InnoDB 一致性 服务可用性
–master-data=1|2 #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释
请准备两套root密码
密码1
QianFeng@123
配置到当前数据库中。
密码2
QianFeng@1234
备用
准备库1
注意
请清理掉之前的test库。实验后半部分,需要继续创建test库,避免混淆。
testdb1.t1
create database testdb1;
use testdb1;
create table t1 (id int);
insert into t1 values(1);
mysql> select * from testdb1.t1;
mkdir /backup
备份数据
mysqldump -p’QianFeng@123’ --all-databases --single-transaction --master-data=2 --flush-logs > /backup/date +%F-%H
-mysql-all.sql
观察备份细节
vim /backup/2016-11-25-14-mysql-all.sql
LOCK TABLESuser
WRITE;
观察各种锁机制,用来保证数据一致性
22 CHANGE MASTER TO MASTER_LOG_FILE=‘localhost-bin.000004’, MASTER_LOG_POS=154;
二进制日志截断位置。第22行
业务正常推进…
\
备份后的,数据变更行为
在testdb2.t2 中插入数据1,2,3;
创testdb3库
切断二进制日志(重启数据库)
在testdb2.t2 中插入数据4;
删testdb3库
在testdb2.t2 中插入数据5;
mysql> select * from testdb2.t2;
±-----+
| id |
±-----+
| 1 |
| 2 |
| 3 |
±-----+
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| testdb1 |
| testdb2 |
±-------------------+
12 rows in set (0.00 sec)
1 备份二进制日志文件
cp /var/lib/mysql/bin ~
2. 停止数据库
systemctl stop mysqld
3. 清理环境
rm -rf /var/lib/mysql/*
4.启动数据库
systemctl start mysqld
5.查看密码
grep ‘password’ /var/log/mysqld.log
6.更改密码2
mysqladmin -uroot -p’Kyzw;u2dq
7.mysql恢复数据
mysql -p’QianFeng@1234’ < /backup/2020-09-02-14-mysql-all.sql
8.刷新权限
mysql -p’QianFeng@1234’ -e 'flush privileges’
密码1生效,密码2失效
9.二进制文件恢复
mysqlbinlog localhost-bin.000002 localhost-bin.000003
–start-position=154 | mysql -p’QianFeng@123’
注意后续有多少日志,要跟多少日志名字。
如何保留testdb3库
[root@localhost ~]#mysqlbinlog localhost-bin.00004
......005.....006...... > 1.txt
删除1.txt中不需要的at(比如test3库是误操作)
cat 1.txt | mysql -p'QianFeng@123'
cat 1.txt | mysql -p'QianFeng@123'