数据备份和冗余的区别
备份:能够防止机器故障以及人为误操作带来的数据丢失,例如将数据库文件保存在其他地方
冗余:数据有多份冗余,但不等备份,只能防止机械故障还原数据的丢失,假如主备模式、数据库集群
备份过程中必须考虑因素:
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 差异备份
差异备份的原理跟增量一样,只不过备份的时候,指定的不是上一次的备份。
而是指定全量备份(在全量备份的基础上做差异备份)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。