zoukankan      html  css  js  c++  java
  • Mysql数据库备份—-通过LVM快照实现备份还原

    一、实验环境

    一台测试机: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 225 10:53 aria_log.00000001
    4. -rw-rw---- 1 mysql mysql 52 225 10:53 aria_log_control
    5. -rw-rw---- 1 mysql mysql 2795 225 10:53 ib_buffer_pool
    6. -rw-rw---- 1 mysql mysql 12582912 225 10:54 ibdata1
    7. -rw-rw---- 1 mysql mysql 50331648 225 10:54 ib_logfile0
    8. -rw-rw---- 1 mysql mysql 50331648 225 10:53 ib_logfile1
    9. -rw-rw---- 1 mysql mysql 12582912 225 10:54 ibtmp1
    10. -rw-rw---- 1 mysql mysql 6 225 10:54 localhost.pid
    11. -rw-rw---- 1 mysql mysql 0 225 10:54 multi-master.info
    12. drwx------ 2 mysql root 4096 225 10:53 mysql
    13. drwx------ 2 mysql mysql 20 225 10:53 performance_schema
    14. drwx------ 2 mysql root 6 225 10:53 test
    15. [root@localhost ~]# ll /binlog/
    16. 总用量 40
    17. -rw-rw---- 1 mysql mysql 29017 225 10:53 mariadb-bin.000001
    18. -rw-rw---- 1 mysql mysql 344 225 10:54 mariadb-bin.000002
    19. -rw-rw---- 1 mysql mysql 54 225 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的记录,待恢复完成后开启

    六、备份脚本

  • 相关阅读:
    构造与析构的次序
    为什么析构函数常声明为虚函数
    偏移数组的二分查找
    字符串循环右移N位
    const 补充
    对类 sizeof
    指针与引用
    python小练习
    初学数据挖掘——相似性度量(一)
    每天进步一点点(二)
  • 原文地址:https://www.cnblogs.com/momenglin/p/8483311.html
Copyright © 2011-2022 走看看