mysql备份

数据备份和冗余的区别
备份:能够防止机器故障以及人为误操作带来的数据丢失,例如将数据库文件保存在其他地方
冗余:数据有多份冗余,但不等备份,只能防止机械故障还原数据的丢失,假如主备模式、数据库集群
备份过程中必须考虑因素:
1、数据的一致性
2、服务的可用性
逻辑备份和物理备份
逻辑备份:备份的是建表、建库、插入等操作所执行SQL语句(DDL、DML、DCL),适用于中小型数据库,效率相对较低。
mysqldump
mysqlper

物理备份:直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的mysql版本
tar、cp
xtrabackup
inbackup
lvm snapshot
物理备份
完全部分

增量备份

差异备份 
tar 数据备份【物理】
注:备份期间,服务不可用

备份过程:【完全物理备份】
1、停止数据库
2、tar备份数据
3、启动数据库

[root@node2 ~]# systemctl stop mysqld
[root@node2 ~]# mkdir /backup
[root@node2 ~]# tar cvf /backup/`date +%F`-mysql-all.tar /var/lib/mysql
tar: Removing leading `/' from member names

注:备份文件应该复制到其他服务器或存储上

还原过程:
1、停止数据库
2、清理环境
3、导入备份数据
4、启动数据库
5、binlog恢复

[root@node2 ~]# systemctl stop mysqld

[root@node2 ~]# rm -rf /var/lib/mysql/*

[root@node2 ~]# tar xf /backup/2019-03-11-mysql-all.tar -C /

[root@node2 ~]# systemctl start mysqld

5.7需要登陆数据库修改密码:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql>  set password for 'root'@'localhost'  = password('Moiin!@#123');
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;

binlog恢复:

LVM快照【物理】
这只能恢复到快照的那个点,如果恢复在当前,还需要binlog恢复

如果我们的mysql安装目录,没有在逻辑卷上,就需要先做数据迁移

lvscan ==》查看快照
lsblk  ==>

新增一块硬盘/dev/vdb

1、准备lvm及文件系统
vgcreate datavg /dev/vdb
lvcreate -n mysql -L 2G /dev/datavg/mysql
mkfs.xfs /dev/datavg/mysql

2、将数据迁移到lvm
systemctl stop mysqld

修改vim /etc/fstab目录:(实现自动挂载)
/var/lib/mysql /dev/datavg/mysql 0  0

mount -a 

chown -R mysql:mysql /dev/datavg/mysql

systemctl start mysqld
-------------
1、加全局锁
2、LVM mysql快照
3、释放锁(可选,因为只要加锁的会话关闭,锁自然就释放了)
4、挂载快照卷(只读,防止破坏数据)
5、从快照卷中复制数据cp tar
6、卸载并删除快照卷
------------------
lvm快照备份流程:
1、加全局锁:
flush tables whith read lock;

2、创建快照:
lvcreate -L 500 -s -n lv-mysql-snap  /dev/datavg/lv-mysql

记录备份到那个点:
mysql -p'123456' -e 'show master status'>/back/`date +%F`_position.txt 

释放锁:
unlock tables;

加锁、创建快照、解锁:必须同一会话完成

echo "flush tables whith read lock; system lvcreate -L 500 -s -n lv-mysql-snap;unlock tables;"|mysql -p'123456' -e 'show master status'>/back/`date +%F`_position.txt 

4、从快照中备份:
mount -o ro,nouuid /dev/datavg/mysql /mnt
cp -a /var/lib/mysql* /mnt

5、移除快照:
cd;umount /mnt
lvremove -f /dev/datavg/mysql
MySQL物理备份 Xtrabackup
官网:
https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

下载:
$ wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ rpm -ivh percona-release-latest.noarch.rpm
$ yum list | grep percona
$ yum install percona-xtrabackup-24

报错:
其中中有报错"libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.6-2.el6.x86_64"。应该是缺少libev.so.4。
解决:
wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
rpm -ivh libev-4.04-2.el6.x86_64.rpm

删除:
yum remove percona-xtrabackup

备份:
mkdir /xtraback/full -p
innobackupex --user=root --password='123456'  /xtraback/full 

恢复:
1、停止数据库
2、清理环境
3、重演回滚-->恢复数据
4、修改权限
5、启动数据库

1、systemctl stop mysqld
2、rm -rf /var/lib/mysql/*
3、合成可用的一致的数据
innobackupex --apply-log /xtraback/full/2019-03-12_20-55-09/

将上面合成的数据还原回对应的数据目录中
innobackupex --copy-back /xtraback/full/2019-03-12_20-55-09/
4、chown -R mysql:mysql /var/lib/mysql
5、systemctl start mysqld

MySQL物理备份 Xtrabackup 增量备份
mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)
mysql> create table testdb.t1(id int);
Query OK, 0 rows affected (0.09 sec)
mysql> insert into testdb.t1 value(1);
Query OK, 1 row affected (0.03 sec)
mysql> select * from testdb.t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

------------------------------------
第一次:全量备份
[root@node2 ~]# date -s 20190314
mysql>  insert into testdb.t1 value(20190314);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t1;
+----------+
| id       |
+----------+
| 20190314 |
+----------+
1 row in set (0.00 sec)

[root@node2 ~]# innobackupex --user=root --password='123456' --incremental /xtraback

-----------------------
第二天数据备份:
[root@node2 ~]# date -s 20190315
插入数据:
mysql> insert into testdb.t1 value(20190315);
Query OK, 1 row affected (0.01 sec)

mysql> 
mysql> select * from t1;
+----------+
| id       |
+----------+
| 20190314 |
| 20190315 |
+----------+
2 rows in set (0.00 sec)

innobackupex --user=root --password='123456' --incremental /xtraback --incremental-basedir=/xtraback/2019-03-14_01-18-36

说明:
--incremental /xtraback  备份保存在哪个目录
--incremental-basedir=/xtraback/2019-03-14_01-18-36   指定上次的备份文件,即备份与这次有差异的
------------------------
第三天数据备份:
[root@node2 ~]# date -s 20190316
插入数据
mysql> insert into testdb.t1 value(20190316);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t1;
+----------+
| id       |
+----------+
| 20190314 |
| 20190315 |
| 20190316 |
+----------+
3 rows in set (0.00 sec)

innobackupex --user=root --password='123456' --incremental /xtraback --incremental-basedir=/xtraback/2019-03-15_00-00-45

说明:
--incremental /xtraback  备份保存在哪个目录
--incremental-basedir=/xtraback/2019-03-15_00-00-45   指定上次的备份文件,即备份与这次有差异的

--------------------------
三天的备份文件
[root@node2 ~]# ls /xtraback/
2019-03-14_01-18-36  2019-03-15_00-00-45  2019-03-16_00-00-03
-------------------------
对比三次备份的数据,是吻合的:

[root@node2 ~]# cat /xtraback/2019-03-14_01-18-36/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0          ==>开始
to_lsn = 23315399     ==>结束
last_lsn = 23315408
compact = 0
recover_binlog_info = 0

[root@node2 ~]# cat /xtraback/2019-03-15_00-00-45/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 23315399  ==>开始
to_lsn = 23320150    ==>结束
last_lsn = 23320159
compact = 0
recover_binlog_info = 0

[root@node2 ~]# cat /xtraback/2019-03-16_00-00-03/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 23320150  ==>开始
to_lsn = 23320487    ==>结束
last_lsn = 23320496
compact = 0
recover_binlog_info = 0

-------------------------------------
搞一个新环境,将备份数据拷贝过去,安装xtrabackup工具:

恢复:
先恢复全量的:
[root@node2 ~]# innobackupex --apply-log --redo-only --use-memory=1G /xtraback/2019-03-14_01-18-36

拷贝数据到/var/lib/mysqld (他怎么知道拷贝到这个文件?他是读取 /etc/my.cnf文件,里面定义了datadir=/var/lib/mysql)
[root@node2 ~]# innobackupex --copy-back /xtraback/2019-03-14_01-18-36

[root@node2 ~]# chown -R mysql:mysql /var/lib/mysql

[root@node2 ~]# systemctl start mysqld

mysql>  select * from testdb.t1;
+----------+
| id       |
+----------+
| 20190314 |
+----------+
1 row in set (0.00 sec)
-------------------
将第一次增量跟全量整合:

[root@node2 ~]# innobackupex --apply-log --redo-only --use-memory=1G /xtraback/2019-03-14_01-18-36 --incremental-dir=/xtraback/2019-03-15_00-00-45/

[root@node2 ~]# cat /xtraback/2019-03-14_01-18-36/xtrabackup_checkpoints 
backup_type = log-applied
from_lsn = 0
to_lsn = 23320150    
last_lsn = 23320159  
compact = 0
recover_binlog_info = 0

拷贝数据到/var/lib/mysqld (他怎么知道拷贝到这个文件?他是读取 /etc/my.cnf文件,里面定义了datadir=/var/lib/mysql)
删除旧数据:
[root@node2 ~]# rm -rf /var/lib/mysql/*

[root@node2 ~]# innobackupex --copy-back /xtraback/2019-03-14_01-18-36

[root@node2 ~]# chown -R mysql:mysql /var/lib/mysql

[root@node2 ~]# systemctl start mysqld

mysql>  select * from testdb.t1;
+----------+
| id       |
+----------+
| 20190314 |
| 20190315 |
+----------+
2 rows in set (0.01 sec)
-----------------------

将第二次增量备份整合到全量备份里面:
innobackupex --apply-log --redo-only --use-memory=1G /xtraback/2019-03-14_01-18-36 --incremental-dir=/xtraback/2019-03-16_00-00-03

[root@node2 xtraback]# cat /xtraback/2019-03-14_01-18-36/xtrabackup_checkpoints 
backup_type = log-applied
from_lsn = 0
to_lsn = 23320487
last_lsn = 23320496
compact = 0
recover_binlog_info = 0

拷贝数据到/var/lib/mysqld (他怎么知道拷贝到这个文件?他是读取 /etc/my.cnf文件,里面定义了datadir=/var/lib/mysql)
删除旧数据:
[root@node2 ~]# rm -rf /var/lib/mysql/*

[root@node2 ~]# innobackupex --copy-back /xtraback/2019-03-14_01-18-36
当然我们也可以直接用命令拷贝:
[root@node2 ~]# cp -rf /xtraback/2019-03-14_01-18-36/* /var/lib/mysql/

[root@node2 ~]# chown -R mysql:mysql /var/lib/mysql

[root@node2 ~]# systemctl start mysqld

mysql>  select * from testdb.t1;
+----------+
| id       |
+----------+
| 20190314 |
| 20190315 |
| 20190316 |
+----------+
3 rows in set (0.01 sec)
MySQL物理备份 Xtrabackup 差异备份
差异备份的原理跟增量一样,只不过备份的时候,指定的不是上一次的备份。
而是指定全量备份(在全量备份的基础上做差异备份)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容