MySQL(一):分别基于mysqldump、lvm2、xtrabackup三种方式实现备份恢复

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

分别基于mysqldump、lvm2、xtrabackup三种方式实现MySQL备份恢复


一、利用mysqldump实施逻辑备份操作


1.在/etc/my.cnf中添加如下,开启二进制日志

 innodb-file-per-table = ON

 skip-name-resolve=ON

 log_bin=/var/log/maradb/binlog


2.备份数据,锁表,二进制日志做滚动,CHANGE MASTER TO设置为2让语句被注释

[root@zj07 ~]# mysqldump -uroot -hlocalhost zrs --lock-tables --flush-logs --master-data=2 > /tmp/zrs.1.sql


查看日志存放位置,出现2,即日志发生滚动

[root@zj07 ~]# ls /var/log/mariadb

binlog.000001  binlog.000002  binlog.index  mariadb.log


添加数据库结构,即显示数据库的创建和使用 --databases

[root@zj07 ~]# mysqldump -uroot -hlocalhost --databases zrs --lock-tables --flush-logs --master-data=2 > /tmp/zrs.2.sql


备份整个服务器的数据库 --all-databases 

[root@zj07 ~]# mysqldump -uroot -hlocalhost --all-databases --lock-tables --flush-logs --master-data=2 > /tmp/myserver.1.sql


3.模拟故障


进程崩溃

[root@zj07 ~]# killall mysqld mysqld_safe

所有的库文件丢失

[root@zj07 ~]# rm -rf /var/lib/mysql/*


4.恢复备份


先启动服务

[root@zj07 ~]# systemctl start mariadb


查看已经生成修复的库文件

[root@zj07 ~]# ls /var/lib/mysql/

aria_log.00000001  ibdata1      ib_logfile1  mysql.sock          test

aria_log_control   ib_logfile0  mysql        performance_schema


因为恢复的过程,也会产生命令记录,导致数据改变,所以强制不让其记录到二进制


[root@zj07 ~]# mysql


仅设置当前会话即可

MariaDB [(none)]> set @@session.sql_log_bin=OFF;


恢复数据

MariaDB [(none)]> source /tmp/myserver.1.sql


再开启二进制记录

MariaDB [zrs]> set @@session.sql_log_bin=ON;


5.当恢复数据后,需要删除备份,再重新备份,备份数据仅使用一次。



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


二、利用lvm2实现物理备份操作

温备份(几乎热备)


1.先创建一个分区

[root@zj07 ~]# fdisk /dev/sda


命令(输入 m 获取帮助):n

Partition type:

   p   primary (2 primary, 0 extended, 2 free)

   e   extended

Select (default p): 

Using default response p

分区号 (3,4,默认 3):

起始 扇区 (109684736-167772159,默认为 109684736):

将使用默认值 109684736

Last 扇区, +扇区 or +size{K,M,G} (109684736-167772159,默认为 167772159):+20G

分区 3 已设置为 Linux 类型,大小设为 20 GiB


命令(输入 m 获取帮助):t

分区号 (1-3,默认 3):3

Hex 代码(输入 L 列出所有代码):8e

已将分区“Linux”的类型更改为“Linux LVM”


命令(输入 m 获取帮助):w


partprobe一下


[root@zj07 ~]# partprobe /dev/sda


查看刚才创建的分区是否存在

[root@zj07 ~]# cat /proc/partitions



做物理卷

[root@zj07 ~]# pvcreate /dev/sda3

  Physical volume "/dev/sda3" successfully created.


做卷组

[root@zj07 ~]# vgcreate datavg /dev/sda3

  Volume group "datavg" successfully created


创建逻辑卷,指定名字

[root@zj07 ~]# lvcreate -L 8G -n mydata datavg

  Logical volume "mydata" created.


查看

[root@zj07 ~]# lvs

  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

  root   centos -wi-ao---- 50.00g                                                    

  swap   centos -wi-ao----  2.00g                                                    

  mydata datavg -wi-a-----  8.00g                                                    

[root@zj07 ~]# ls /dev/mapper/

centos-root  centos-swap  control  datavg-mydata

[root@zj07 ~]# ls /dev/datavg/

mydata


格式化

[root@zj07 ~]# mke2fs -b 2048 -t ext4 /dev/datavg/mydata


[root@zj07 ~]# blkid /dev/datavg/mydata

/dev/datavg/mydata: UUID="95e9edc9-257a-49c6-b44b-235f18af371d" TYPE="ext4" 


创建目录

[root@zj07 ~]# mkdir -pv /data/mydata


挂载这个lvm到创建的目录下,在配置文件中,添加如下

[root@zj07 ~]# vim /etc/fstab


UUID="95e9edc9-257a-49c6-b44b-235f18af371d"   /data/mydata  ext4 defaults,acl  0  0


查看

[root@zj07 ~]# mount -a 

[root@zj07 ~]# df

文件系统                     1K-块    已用     可用 已用% 挂载点

/dev/mapper/centos-root   52403200 4552636 47850564    9% /

...

...

...

/dev/mapper/datavg-mydata  8190760   12308  7750830    1% /data/mydata


更改该目录的属主属组

[root@zj07 ~]# chown -R mysql.mysql /data/*


修改配置文件

[root@zj07 ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mydata

socket=/data/mydata/mysql.sock


2.模拟故障


进程崩溃

[root@zj07 ~]# killall mysqld mysqld_safe

所有的库文件丢失

[root@zj07 ~]# rm -rf /var/lib/mysql/*


3.恢复备份


先启动服务

[root@zj07 ~]# systemctl start mariadb


当更改sock文件后,进入mysql会提示错误,可以如下设置配置文件,即可。

[root@zj07 ~]# mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)


[root@zj07 ~]# vim .my.cnf

[client]

socket='/data/mydata/mysql.sock'


关闭二进制日志记录,恢复备份,再开启二进制日志记录。

MariaDB [(none)]> set @@session.sql_log_bin=OFF;

MariaDB [(none)]> source /tmp/myserver.1.sql;

MariaDB [zrs]> set @@session.sql_log_bin=ON;


为了测试,先创建一个表,插入数据

MariaDB [zrs]> create table if not exists tbl5 (UID tinyint unsigned not null auto_increment primary key,Username varchar(100),Age tinyint unsigned);

MariaDB [zrs]> insert into tbl5 (Username,Age) values ('Zhang san',30),('Li si',27);


给表加一个读锁

MariaDB [zrs]> flush tables with read lock;


创建快照卷

[root@zj07 ~]# lvcreate -L 5G -s -p r -n data_backup /dev/datavg/mydata

  Using default stripesize 64.00 KiB.

  Logical volume "data_backup" created.


立马释放锁

MariaDB [zrs]> unlock tables;


创建目录

[root@zj07 ~]# mkdir -pv /mnt/backup


挂载

[root@zj07 ~]# mount /dev/datavg/data_backup /mnt/backup


查看

[root@zj07 ~]# ls /mnt/backup/

aria_log.00000001  ibdata1      ib_logfile1  mysql.sock          test

aria_log_control   ib_logfile0  mysql        performance_schema  zrs


创建备份目录

[root@zj07 ~]# mkdir /tmp/backup


将文件全部备份到该目录

[root@zj07 ~]# cd /mnt/backup

[root@zj07 backup]# cp -a * /tmp/backup/


删除不需要的文件

[root@zj07 backup]# rm -f /tmp/backup/mysql.sock 


记录下面的二进制数值,以备之后恢复数据

MariaDB [zrs]> show master status;

+---------------+----------+--------------+------------------+

| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| binlog.000012 |    759 |         |            |

+---------------+----------+--------------+------------------+


4.模拟故障

[root@zj07 ~]# killall mysqld mysqld_safe


挂载并删除快照卷

[root@zj07 ~]# umount /mnt/backup/

[root@zj07 ~]# lvremove  /data/datavg/data_backup


删除目录下的文件

[root@zj07 ~]# rm -rf /data/mydata/*



5.下面开始进行物理备份还原


[root@zj07 ~]# cd /tmp/backup/


[root@zj07 backup]# cp -a * /data/mydata/


启动服务

[root@zj07 backup]# systemctl start mariadb

[root@zj07 backup]# mysql

MariaDB [(none)]> use zrs;

MariaDB [zrs]> select * from tbl5;

+-----+-----------+------+

| UID | Username | Age  |

+-----+-----------+------+

|  1 | Zhang san|   30 |

|  2 | Li si   |   27 |

+-----+-----------+------+


发现刚才新建的数据并没有恢复


利用二进制日志恢复

[root@zj07 ~]# mysqlbinlog --start-position=759 /var/log/mariadb/binlog.000012 > /tmp/lvm.sql


关闭二进制记录功能

MariaDB [zrs]> set @@session.sql_log_bin=OFF;


利用二进制日志恢复数据

MariaDB [zrs]> \. /tmp/lvm.sql


开启二进制记录功能

MariaDB [zrs]> set @@session.sql_log_bin=ON;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


三、利用xtrabackup实现物理备份操作


1.安装软件

yum install percona-xtrabackup


2.

创建备份目录

[root@zj07 ~]# mkdir /data/backup


更改属组属主

[root@zj07 ~]# chown mysql. /data/backup/


完全备份

[root@zj07 ~]# innobackupex --user=root --host=localhost --socket=/data/mydata/mysql.sock /data/backup/


查看,以时间命名创建目录

[root@zj07 ~]# ls /data/backup/

2018-01-15_16-48-43


为了做增量备份,先修改表内容,如下

MariaDB [zrs]> insert into tbl5 (username,age) values ('Qi qi',55);

MariaDB [zrs]> delete from tbl5 where UID between 1 and 2;


做增量备份,指明基于哪一次完全备份

[root@zj07 ~]# innobackupex --user=root --socket=/data/mydata/mysql.sock --incremental /data/backup/ --incremental-basedir=/data/backup/2018-01-15_16-48-43


查看,已经生成增量备份

[root@zj07 ~]# ls /data/backup/

2018-01-15_16-48-43  2018-01-15_17-10-47


如何区分呢,查看该配置文件

[root@zj07 ~]# cat /data/backup/2018-01-15_16-48-43/xtrabackup_checkpoints 

backup_type = full-backuped

from_lsn = 0

to_lsn = 1611662

last_lsn = 1611662

compact = 0

recover_binlog_info = 0

[root@zj07 ~]# cat /data/backup/2018-01-15_17-10-47/xtrabackup_checkpoints 

backup_type = incremental

from_lsn = 1611662

to_lsn = 1613212

last_lsn = 1613212

compact = 0

recover_binlog_info = 0


为了再次做增量备份,再次修改表内容,如下

MariaDB [zrs]>  create table if not exists tbl7 (UID tinyint unsigned not null auto_increment primary key,Username varchar(100),Age tinyint unsigned);

MariaDB [zrs]> insert into tbl7 (Username,Age) values ('name11',98),('name22',99);


基于第二次增量备份,再次做增量

[root@zj07 ~]# innobackupex --user=root --socket=/data/mydata/mysql.sock --incremental /data/backup/ --incremental-basedir=/data/backup/2018-01-15_17-10-47


[root@zj07 ~]# ls /data/backup/

2018-01-15_16-48-43  2018-01-15_17-10-47  2018-01-15_17-38-09


删除数据

MariaDB [zrs]> delete from tbl7 where UID between 1 and 2;

注意:如果在最后一个备份结果集之后,还有其他的数据修改操作,还需要依靠在最后一次备份操作之后的二进制日志的内容来实现数据的完整恢复。


3.模拟故障

[root@zj07 ~]# killall mysqld mysqld_safe

[root@zj07 ~]# cd /data

[root@zj07 data]# rm -rf mydata/*


4.恢复数据


准备工作

[root@zj07 ~]# innobackupex --apply-log --redo-only /data/backup/2018-01-15_16-48-43/

[root@zj07 ~]# innobackupex --apply-log --redo-only /data/backup/2018-01-15_16-48-43/ --incremental-dir=/data/backup/2018-01-15_17-10-47

[root@zj07 ~]# innobackupex --apply-log /data/backup/2018-01-15_16-48-43/ --incremental-dir=/data/backup/2018-01-15_17-38-09


恢复工作

[root@zj07 ~]# innobackupex --copy-back /data/backup/2018-01-15_16-48-43/


查看

[root@zj07 ~]# ls /data/mydata/

ibdata1  performance_schema  xtrabackup_binlog_pos_innodb  zrs

mysql    test                xtrabackup_info



因为在第二次增量备份后,又删除了两个数据,所以需要借助binlog恢复

[root@zj07 ~]# cat /data/backup/2018-01-15_17-38-09/xtrabackup_binlog_info 

binlog.000013 1123


保存

[root@zj07 ~]# mysqlbinlog --start-position=1123 /var/log/mariadb/binlog.000013 > /tmp/last.sql


修改权限

[root@zj07 ~]# chown mysql. -R /data/mydata/*


重启服务

[root@zj07 data]# systemctl start mariadb


查看,该表的内容还在

MariaDB [zrs]> select * from tbl7;

+-----+----------+------+

| UID | Username | Age |

+-----+----------+------+

|   1 | name11 |  98 |

|   2 | name22 |  99 |

+-----+----------+------+


关闭二进制日志记录功能

MariaDB [zrs]> set @@session.sql_log_bin=OFF;


恢复

MariaDB [zrs]> \. /tmp/last.sql


开启二进制日志记录功能

MariaDB [zrs]> set @@session.sql_log_bin=ON;


查看,该表的内容已经没有了

MariaDB [zrs]> select * from tbl7;

Empty set (0.01 sec)

------------------------------------------------------------------------------------------------------------------------------------------

总结:

MySQL的备份和恢复:

  mysqldump:逻辑备份 + 温备|热备 + binlog

  lvm2:物理备份 + 温备(几乎热备) + binlog

  Xtrabackup:物理备份 + 温备|热备 + (完全+增量) + binlog


  异地灾备



本文转自 Runs_ 51CTO博客,原文链接:http://blog.51cto.com/12667170/2061485,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
rds备份与恢复
rds备份与恢复
55 3
|
3月前
|
关系型数据库 MySQL 数据库
Python tk dos命令备份mysql数据库
Python tk dos命令备份mysql数据库
24 0
|
3月前
|
存储 关系型数据库 MySQL
mysql数据库如何做到定期备份
mysql数据库如何做到定期备份
288 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』
MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』
51 0
|
2月前
|
SQL 关系型数据库 MySQL
mysql怎么备份
mysql怎么备份
188 7
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表10、数据导入和导出——1、数据导入(LOAD DATA, mysqldump)——2、数据导出(SELECT ... INTO OUTFILE, mysqldump)
MySQL技能完整学习列表10、数据导入和导出——1、数据导入(LOAD DATA, mysqldump)——2、数据导出(SELECT ... INTO OUTFILE, mysqldump)
48 0
|
3月前
|
存储 关系型数据库 MySQL
利用Xtrabackup进行mysql增量备份和全量备份
利用Xtrabackup进行mysql增量备份和全量备份
171 0
|
2月前
|
关系型数据库 MySQL Linux
Linux环境下定时备份mysql数据库
Linux环境下定时备份mysql数据库
|
2月前
|
存储 关系型数据库 MySQL
mysql怎么备份
mysql怎么备份
21 7
|
2月前
|
监控 容灾 安全
规划阿里云RDS跨区迁移并构建容灾与备份策略
规划阿里云RDS(Relational Database Service)跨区迁移并构建容灾与备份策略
109 2