一、实验环境

一台测试机: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源端的包,epel源可以在http://mirrors.aliyun.com/repo/下载

2、安装mariadb

  1. yum install -y mariadb-server

3、修改maraidb的配置文件

  1. vim /etc/my.cnf.d/server.cnf
  2. 在[mysqld]下添加如下项目
  3. innodb_file_per_table #每个标的库数据存放在单独的位置
  4. log_bin=/binlog/mariadb-bin #保存的二进制文件头
  5. 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---- 1 mysql mysql 16384 2月 25 10:53 aria_log.00000001
  4. -rw-rw---- 1 mysql mysql 52 2月 25 10:53 aria_log_control
  5. -rw-rw---- 1 mysql mysql 2795 2月 25 10:53 ib_buffer_pool
  6. -rw-rw---- 1 mysql mysql 12582912 2月 25 10:54 ibdata1
  7. -rw-rw---- 1 mysql mysql 50331648 2月 25 10:54 ib_logfile0
  8. -rw-rw---- 1 mysql mysql 50331648 2月 25 10:53 ib_logfile1
  9. -rw-rw---- 1 mysql mysql 12582912 2月 25 10:54 ibtmp1
  10. -rw-rw---- 1 mysql mysql 6 2月 25 10:54 localhost.pid
  11. -rw-rw---- 1 mysql mysql 0 2月 25 10:54 multi-master.info
  12. drwx------ 2 mysql root 4096 2月 25 10:53 mysql
  13. drwx------ 2 mysql mysql 20 2月 25 10:53 performance_schema
  14. drwx------ 2 mysql root 6 2月 25 10:53 test
  15. [root@localhost ~]# ll /binlog/
  16. 总用量 40
  17. -rw-rw---- 1 mysql mysql 29017 2月 25 10:53 mariadb-bin.000001
  18. -rw-rw---- 1 mysql mysql 344 2月 25 10:54 mariadb-bin.000002
  19. -rw-rw---- 1 mysql mysql 54 2月 25 10: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 sec)
  6. #test库是空的,我们创建一个新表
  7. MariaDB [test]> CREATE TABLE IF NOT EXISTS `test`(
  8. -> `runoob_id` INT UNSIGNED AUTO_INCREMENT,
  9. -> `runoob_title` VARCHAR(100) NOT NULL,
  10. -> `runoob_author` VARCHAR(40) NOT NULL,
  11. -> `submission_date` DATE,PRIMARY KEY ( `runoob_id` )
  12. -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
  13. Query OK, 0 rows affected (0.01 sec)
  14. 插入3条数据
  15. MariaDB [test]> insert into test (runoob_title,runoob_author,submission_date) values ('test1','stuff',now());
  16. Query OK, 1 row affected, 1 warning (0.01 sec)
  17. MariaDB [test]> insert into test (runoob_title,runoob_author,submission_date) values ('test2','stuff',now());
  18. Query OK, 1 row affected, 1 warning (0.01 sec)
  19. MariaDB [test]> insert into test (runoob_title,runoob_author,submission_date) values ('test3','Goodluck',now());
  20. Query OK, 1 row affected, 1 warning (0.01 sec)

查看我们创建的数据

  1. MariaDB [test]> select * from test;
  2. +-----------+--------------+---------------+-----------------+
  3. | runoob_id | runoob_title | runoob_author | submission_date |
  4. +-----------+--------------+---------------+-----------------+
  5. | 1 | test1 | stuff | 2018-02-25 |
  6. | 2 | test2 | stuff | 2018-02-25 |
  7. | 3 | test3 | Goodluck | 2018-02-25 |
  8. +-----------+--------------+---------------+-----------------+
  9. 3 rows in set (0.00 sec)
  10. MariaDB [test]>

6、创建数据库的快照实现数据库的备份

  1. 首先创建备份目录
  2. mkdir /backup
  3. 对数据添加写锁
  4. [root@localhost ~]# mysql -e 'FLUSH TABLES WITH READ LOCK;'
  5. 记录binlog当前的position并记录到文件
  6. [root@localhost ~]# mysql -e 'show binary logs' | tail -n 1 > /backup/binlog_position
  7. 创建数据库快照
  8. [root@localhost ~]# lvcreate -n sql_data_snapshot -L 1G -s -p r /dev/sql_data_dump/sql_data
  9. 生成新的binlog文件
  10. [root@localhost ~]# mysql -e 'flush logs;'
  11. 解除数据库锁定
  12. [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.000002 1522
  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的记录,待恢复完成后开启

六、备份脚本

Mysql数据库备份—-通过LVM快照实现备份还原的更多相关文章

  1. mysql数据库基于LVM快照的备份

    lvm-snapshot: 基于LVM快照的备份 1.事务日志跟数据文件必须在同一个卷上          2.创建快照卷之前,要请求mysql的全局锁,在快照创建完成之后释放锁          3 ...

  2. MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot)

    MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是快照卷 如上图所示,原卷和快照卷可以不一样大,因为 ...

  3. MySQL数据物理备份之lvm快照

    使用lvm快照实现物理备份 优点: 几乎是热备(创建快照前把表上锁,创建完后立即释放) 支持所有存储引擎 备份速度快 无需使用昂贵的商业软件(它是操作系统级别的) 缺点: 可能需要跨部门协调(使用操作 ...

  4. MySQL数据库双机热备------主-主备份配置

    MySQL数据库双机热备------主-主备份配置 实验环境: 主1数据库 192.168.1.1 centos6.5 x86_64 +MySQL5.5.35 主2数据库192.168.1.2  Wi ...

  5. mysql 基于lvm快照的备份

    1.查看磁盘数 ls /dev/ | grep sd 2.快照备份 pvcreate /dev/sdb #制作成物理卷vgcreate testvg /dev/sdblvcreate -L200M - ...

  6. MySQL基于LVM快照的备份恢复(临时)

    目录1.数据库全备份2.准备LVM卷3.数据恢复到LVM卷4.基于LVM快照备份数据5.数据灾难恢复6.总结 写在前面:测试环境中已安装有mysql 5.5.36数据库,但数据目录没有存放在LVM卷, ...

  7. [原创]MySQL数据库查询和LVM备份还原学习笔记记录

    一.查询语句类型: 1)简单查询 2)多表查询 3)子查询 4)联合查询 1)简单查询: SELECT * FROM tb_name; SELECT field1,field2 FROM tb_nam ...

  8. LVM快照(snapshot)备份

    转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv ...

  9. MySQL数据库----IDE工具介绍及数据备份

    一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...

随机推荐

  1. 最新 欢聚时代java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.欢聚时代等10家互联网公司的校招Offer,因为某些自身原因最终选择了欢聚时代.6.7月主要是做系统复习.项目复盘.Leet ...

  2. jquery清除元素的点击事件

    $("#id").css("pointer-events", "none");

  3. Cent7.2单用户模式

      1. 在进入系统时选择内核启动. 2. 按'e'进入编辑模式,找到带有内核的那一行. 3. 将ro(read only)改为rw init=/sysboot/bin/sh. 4. 按下ctrl+x ...

  4. Hanlp-地名识别调试方法详解

    HanLP收词特别是实体比较多,因此特别容易造成误识别.下边举几个地名误识别的例子,需要指出的是,后边的机构名识别也以地名识别为基础,因此,如果地名识别不准确,也会导致机构名识别不准确. 类型1 数字 ...

  5. 服务器TIME_WAIT和CLOSE_WAIT区别及解决方案

    系统上线之后,通过如下语句查看服务器时,发现有不少TIME_WAIT和CLOSE_WAIT. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) ...

  6. java中拦截器与过滤器之间的区别

    过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...

  7. 虚拟局域网VLAN的Packet tracer实验

    ICMP的广播请求 Create PDU pc1发向交换机 交换机的其余端口向外发送该广播 ------------------------------------------------------ ...

  8. Snoopy.class.php介绍

    Snoopy是一个开源的模拟抓取工具,找到一个不错的介绍网页 记录一下: php开源采集类Snoopy.class.php功能使用介绍与下载地址 Snoopy.class.php使用手册 还有一个介绍 ...

  9. 怎样理解JS的预解析机制

    JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...

  10. 前端vue项目执行npm install 报错cd() never called()

    前端我刚开始接触Vue,从GitHub上下载了代码程序,但缺少一些插件,用vscode打开并下载插件执行报错cd() never called! 解决的方式 1.执行cmd命令行不要再vscode里执 ...