一、实验环境

一台测试机: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. 用elasticsearchdump备份恢复数据

    1.安装elastic searchdump mkdir /data/nodejs cd /data/nodejs wget https://nodejs.org/dist/v10.16.2/node ...

  2. TensorFlow 官方文档 Programmer's Guide 中文翻译 —— 引言

    TensorFlow Programmer's Guide (Introduction) TensorFlow 编程手册 (引言) #(本项目对tensorflow官网上给出的指导手册(TF1.3版本 ...

  3. Jmeter对Websocket进行接口压力测试

    压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内,向系统发送预期数量的交易请求 ...

  4. 把Javascript 对象转换为键值对连接符字符串的方法总结

    307down votefavorite 93 Do you know a fast and simple way to encode a Javascript Object into a strin ...

  5. Netty源码剖析-启动服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...

  6. 关于container_of函数分析

    #include <stdio.h> #define offset_of(type,member) ((int)&(((type *)0)->member)) #define ...

  7. 笔记-3:mysql数据定义

    1.定义数据库 1.1 创建数据库:创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理. # 基本语法: create {database | schema} [if not exists] d ...

  8. Iedis - Redis 在IDEA中的可视化工具破解

    2.如何破解 // 如果你没有改动IDEA的话,IDEA的插件库在这个目录下C:\Users\Administrator\.IntelliJIdea2017.3\config\plugins\Iedi ...

  9. 怎样终止HTTP请求

    使用 xhr.abort() var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://www.example.com/page.php', tr ...

  10. 【opencv 源码剖析】 三、 morphOp 数学形态学滤波函数, 腐蚀和膨胀就是通过这个函数得到的

    // //_kernel : 形态学滤波的核 //anchor: 锚点再滤波核的位置 //iterations: 迭代次数 static void morphOp( int op, InputArra ...