一、实验环境

一台测试机: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. VS开发】C中调用C++文件中定义的function函数

    [VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...

  2. linux日常常用命令分析

    日志处理: 测试网络路由: xargs使用方法: tcpdump命令分析: dd 写入磁盘测试 cpu个数: 查看网卡流量 查看端口联通情况,临时加端口 ntpdate同步: 可以取出变动的密码: 导 ...

  3. UWP 保存音乐或视频缩略图图片到本地

    开发项目时,有时需要将本地媒体文件的缩略图保存到本地,下面是源码. 需要打开Package.appxmanifest 功能 图片库 访问权限. <Page x:Class="SaveB ...

  4. Http请求头和响应头(Get和Post)

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  5. Python+requests 发送简单请求--》获取响应状态--》获取请求响应数据

    Python+requests 发送简单请求-->获取响应状态-->获取请求响应数据 1.环境:安装了Python和vscode编译器(Python自带的编译器也ok).fiddler抓包 ...

  6. Django使用DataTables插件总结

    Django使用Datatables插件总结 文章中的例子已上传至github 基本使用 Datatables插件是一款方便简单的展示数据的列表插件.关于基本使用,官方网站上的已介绍的很详细,这里我再 ...

  7. Spark Scala当中reduceByKey(_+_) reduceByKey((x,y) => x+y)的用法

    [学习笔记] reduceByKey(_+_)是reduceByKey((x,y) => x+y)的一个 简洁的形式*/ val rdd08 = sc.parallelize(List((1, ...

  8. 【51nod】2027 期望问题

    [51nod]2027 期望问题 %%%zsy 看不懂题解的垃圾选手在zsy大佬的讲解下终于知道了这道题咋做-- 先把所有\(a\)从大到小排序 设\(f_{i}\)为前\(i\)个数组成的排列的值, ...

  9. Python 解LeetCode:23. Merge k Sorted Lists

    题目描述:把k个排序的链表组成的列表合并成一个排序的链表 思路: 使用堆排序,遍历列表,把每个列表中链表的头指针的值和头指针本身作为一个元素放在堆中: 第一步中遍历完列表后,此时堆中最多会有n个元素, ...

  10. ReLeQ:一种自动强化学习的神经网络深度量化方法

    ReLeQ:一种自动强化学习的神经网络深度量化方法     ReLeQ:一种自动强化学习的神经网络深度量化方法ReLeQ: An Automatic Reinforcement Learning Ap ...