一、实验环境

一台测试机:A(172.18.30.1)

操作系统:Centos7

操作对象数据库版本:mariadb-10.2

二、实现目的

从A机器(172.18.30.1)简单搭建数据库,创建测试数据,使用逻辑卷快照实现数据的备份,执行误操作,通过备份实现数据的还原

三、简单实验步骤

  1. 创建卷组和逻辑卷
  2. 挂载逻辑卷到指定位置
  3. 配置mysql的rpm源
  4. A机器yum安装maraidb
  5. 配置mysql配置文件
  6. 创建测试数据
  7. 锁定数据库写操作
  8. 执行LVM的快照操作,对数据库状态进行快照
  9. 记录当前binlog的position
  10. 解锁数据库写操作
  11. 挂载快照,将快照中的数据拷贝到备份目录
  12. 删除快照
  13. 登录数据库执行误操作
  14. 使用LVM快照进行恢复
  15. 通过BINlog删除执行的误操作指令,并还原数据库

四、实验步骤

1、创建卷组和两个逻辑卷,并将逻辑卷分别挂载在存放数据库的目录与存放binlog的目录

使用A机器现有的磁盘sdb创建逻辑卷(在实际的生产线上建议使用不同的vg来创建lv)

  1. 创建逻辑卷
  2. pvcreate /dev/sdb
  3. vgcreate sql_data_dump /dev/sdb
  4. lvcreate -n sql_data -L 5G sql_data_dump #存放数据库的lv
  5. lvcreate -n sql_binlog -L 5G sql_data_dump #存放binlog的lv

  6. 为逻辑卷创建文件系统
  7. mkfs.xfs /dev/sql_data_dump/sql_data
  8. mkfs.xfs /dev/sql_data_dump/sql_binlog

  9. 现将两个lv分别挂载到不同的目录
  10. mount /dev/sql_data_dump/sql_data /data
  11. mount /dev/sql_data_dump/sql_binlog /binlog

  12. 修改目录权限

chown mysql.mysql /data /binlog

2、配置mysql的rpm源

1. vim /etc/yum.repos.d/mariadb.repo
2. [mariadb]
3. name = MariaDB
4. baseurl = http://yum.mariadb.org/10.2/rhel7-amd64
5. gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
6. gpgcheck=1

注意:rpm安装的mariadb需要个epel源端的包

2、安装mariadb

  1. yum install -y mariadb-server

3、修改maraidb的配置文件

  1. vim /etc/my.cnf.d/server.cnf

  2. 在[mysqld]下添加如下项目
1. 
2. innodb_file_per_table #每个标的库数据存放在单独的位置
3. log_bin=/binlog/mariadb-bin #保存的二进制文件头
4. datadir = /data

4、启动数据库

  1. 因为我们修改了默认的数据库位置,所以需要先初始化数据库
  2. mysql_install_db --user=mysql

  3. 启动数据库
  4. systemctl start mariadb

查看数据库和binlog文件是否正常

1. [root@localhost ~]# ll /data/
2. 总用量 122912
3. -rw-rw---- 1163842月 2510:53.00000001
4. -rw-rw---- 1522月 2510:53 aria_log_control
5. -rw-rw---- 127952月 2510:53 ib_buffer_pool
6. -rw-rw---- 1125829122月 2510:54 ibdata1
7. -rw-rw---- 1503316482月 2510:54 ib_logfile0
8. -rw-rw---- 1503316482月 2510:53 ib_logfile1
9. -rw-rw---- 1125829122月 2510:54 ibtmp1
10. -rw-rw---- 162月 2510:54 localhost.pid
11. -rw-rw---- 102月 2510:54 multi-master.info
12. drwx------ 240962月 2510:53 mysql
13. drwx------ 2202月 2510:53 performance_schema
14. drwx------ 262月 2510:53 test
15. [root@localhost ~]# ll /binlog/
16. 总用量 40
17. -rw-rw---- 1290172月 2510:53.000001
18. -rw-rw---- 13442月 2510:54.000002
19. -rw-rw---- 1542月 2510:54 mariadb-bin.index

5、创建数据

1. [root@localhost ~]# mysql
2. MariaDB [(none)]> use test
3. Database changed
4. MariaDB [test]> show tables;
5. Empty set(0.00)
6. 
7. #test库是空的,我们创建一个新表
8. MariaDB [test]> CREATE TABLE IF NOT EXISTS `test`(
9.  -> `runoob_id` INT UNSIGNED AUTO_INCREMENT,
10. VARCHAR(100) NOT NULL,
11. VARCHAR(40) NOT NULL,
12. KEY()
13. )ENGINE=InnoDB DEFAULT CHARSET=utf8;
14. Query OK, 0affected(0.01)
15. 
16. 
17. 插入3条数据
18. 
19. MariaDB [test]> insert into test(runoob_title,runoob_author,submission_date)values('test1','stuff',now());
20. Query OK, 11warning(0.01)
21. 
22. MariaDB [test]> insert into test(runoob_title,runoob_author,submission_date)values('test2','stuff',now());
23. Query OK, 11warning(0.01)
24. 
25. MariaDB [test]> insert into test(runoob_title,runoob_author,submission_date)values('test3','Goodluck',now());
26. Query OK, 11warning(0.01)
查看我们创建的数据
1. MariaDB [test]> select * from test;
2. +-----------+--------------+---------------+-----------------+
3. | runoob_id | runoob_title | runoob_author | submission_date |
4. +-----------+--------------+---------------+-----------------+
5. | 12018-02-25 |
6. | 22018-02-25 |
7. | 32018-02-25 |
8. +-----------+--------------+---------------+-----------------+
9. 3set(0.00)
10. 
11. MariaDB [test]>
6、创建数据库的快照实现数据库的备份
1. 首先创建备份目录
2. mkdir /backup
3. 
4. 对数据添加写锁
5. [root@localhost ~]# mysql -e 'FLUSH TABLES WITH READ LOCK;'
6. 
7. 记录binlog当前的position并记录到文件
8. [root@localhost ~]# mysql -e 'show binary logs' | tail -n 1 > /backup/binlog_position
9. 创建数据库快照
10. [root@localhost ~]# lvcreate -n sql_data_snapshot -L 1G -s -p r /dev/sql_data_dump/sql_data
11. 
12. 生成新的binlog文件
13. [root@localhost ~]# mysql -e 'flush logs;'
14. 
15. 解除数据库锁定
16. [root@localhost ~]# mysql -e 'unlock tables;'

7、挂载快照备份数据

1. [root@localhost ~]# mkdir /snapshot_tmp
2. [root@localhost ~]# mount -o nouuid,norecovery /dev/sql_data_dump/sql_data_snapshot /snapshot_tmp/ 
3. [root@localhost ~]# /usr/bin/cp -ra /snapshot_tmp /backup/mariadb_backup.`date +%F`
4. [root@localhost ~]# umount /snapshot_tmp/

由于我们在生产中可能会有多个全库的备份,所以我们将”/backup/binlog_position”文件移动到对应的数据库备份目录内

  1. mv /backup/binlog_position /backup/mariadb_backup.`date +%F`

8 、删除快照

注意:为什么要删除快照,因为如果有快照的存在,当数据库在有写操作时,实际上是写了双份数据,在实际的逻辑卷上写了一份,同时在快照空间中也写了一份,IO的性能会受到影响,所以在做完备份之后首先要做的便是删除快照

  1. [root@localhost sql_data_dump]# lvremove -y /dev/sql_data_dump/sql_data_snapshot

9、我们再次为数据库添加一条数据,并做删表操作

1. [root@localhost ~]# mysql
2. MariaDB [test]> use test;
3. MariaDB [test]> insert into test(runoob_title,runoob_author,submission_date)values('Thanks a lot','sun',now());
4. MariaDB [test]> drop tables test;

10、数据库的恢复

 注意:LVM恢复数据库的方案需要停止数据库的运行,还好恢复速度相对会比较快

1. [root@localhost /]# systemctl stop mariadb
2. [root@localhost /]# rm -rf /data/*
3. [root@localhost /]# /usr/bin/cp -ra /backup/mariadb_backup.2018-02-25/* /data/

使用binlog恢复误操作之前的数据

1. [root@localhost mariadb_backup.2018-02-25]# cd /binlog
2. [root@localhost binlog]# cat /backup/mariadb_backup.2018-02-25/binlog_position
3. mariadb-bin.0000021522
4. [root@localhost binlog]# mysqlbinlog --start-position=1522 mariadb-bin.000002 > /tmp/binlog.`date +%F`
5. [root@localhost binlog]# mysqlbinlog mariadb-bin.000003 >> /tmp/binlog.`date +%F`
6. [root@localhost binlog]# mysqlbinlog mariadb-bin.000004 >> /tmp/binlog.`date +%F`

删除binlog生成的sql文件中的误操作

  1. [root@localhost binlog]# vim /tmp/binlog.2018-02-25
  2. 删除误操作指令

11、隔离mysql环境,通过一定手段禁止其他用户执行写操作

方法:

1)、开启mysql的read_only功能,禁止非管理员用户修改数据(不推荐,有可能会产生问题,因为在启动数据库之后,设置这条属性之前有可能已经插入了数据)

  1. mysql -e 'set global read_only =1'

2)、设置防火墙策略,禁用mysql数据库连接端口,使mysql与外界连接隔离

做好隔离后启动数据库

1. [root@localhost binlog]# systemctl start mysql

将sql导入到库中

1. [root@localhost binlog]# mysql -e 'set global sql_log_bin=0' #关闭binlog的记录
2. [root@localhost binlog]# mysql < /tmp/binlog.2018-02-25 
3. [root@localhost binlog]# mysql -e 'set global sql_log_bin=1' #开启binlog的记录

五、LVM实现数据恢复的重要事项

  1. 备份数据库时必须要锁表
  2. 恢复数据库时需要停止mysql的运行
  3. 备份完整的数据库成功后需删除快照
  4. 使用binlog恢复数据要注意其他用户的权限问题,如果在恢复数据的过程中有其他用户插入数据会造成数据不一致(mysql环境隔离)
  5. 使用binlog恢复数据时,必须关闭binlog的记录,待恢复完成后开启

六、备份脚本