MySQL常见备份与恢复方案

MySQL常见备份方案有以下三种:

       mysqldump + binlog

       lvm + binlog  

       xtrabackup

本例为方便演示,数据库里面数据为空。下面开始动手

mkdir /opt/backup                                #创建备份目录
mkdir -p /data/3309/{data,binlog}     
cd /usr/local/mysql/
scripts/mysql_install_db --user=mysql --datadir=/data/3309/data/ --basedir=/usr/local/mysql/ 
chown mysql.mysql -R /data/3309/ 
cp support-files/my-small.cnf /data/3309/my.cnf   #提供配置文件

vim /data/3309/my.cnf                             #编辑配置文件
[client]
#password       = your_password
port            = 3309
socket          = /tmp/mysql.sock4
# The MySQL server
[mysqld]
port            = 3309
socket          = /tmp/mysql.sock4
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
datadir = /data/3309/data
server-id       = 3309
log-bin=/data/3309/binlog/mysql-bin   #二进制日志位置
binlog_format=mixed               #二进制日志格式
log-error = /data/3309/mysql-err       #错误日志位置 
innodb_file_per_table = 1            #为每一个新数据表创建一个表空间文件
sync_binlog = 1                    #写二进制日志的时候,同步到磁盘上面

cp /data/3309/my.cnf /opt/backup/   #备份配置文件
mysqld_safe --defaults-file=/data/3309/my.cnf &  #启动mysql

1、利用mysqldump完全备份mysql,配合二进制日志备份实现增量备份

mysqldump 选项请参考http://wangweiak47.blog.51cto.com/2337362/1589304

1.1提供模拟数据

mysql -S /tmp/mysql.sock4   #连接mysql
mysql> use test;
Database changed
mysql> create table test (id int(2),comment char(30));  #创建表
Query OK, 0 rows affected (0.34 sec)
 
mysql> insert into test values (1,'yun zhonghe');  #插入数据
Query OK, 1 row affected (0.16 sec)

1.2全量备份:

mysqldump -S /tmp/mysql.sock4 -A -B -F -x --events --triggers --routines --master-data=2 > /opt/backup/all_data-`date +%F--%U`.sql

1.3 模拟数据发生改变

mysql> insert into test values (2,'yun zhonghe2');    #再插入一条数据。
Query OK, 1 row affected (0.11 sec)

1.4 增量备份

mysqladmin -S /tmp/mysql.sock4 flush-logs   #增量备份前,先滚动一下二进制日志。
cp `cat /data/3309/binlog/mysql-bin.index | tail -n 2 | head -n 1` /opt/backup/   #备份二进制日志

1.5 数据损坏

rm -rf /data/3309/
killall mysqld

1.6 恢复

上面已经提供了步骤,直接复制过来使用。

mkdir -p /data/3309/{data,binlog}
cd /usr/local/mysql/
scripts/mysql_install_db --user=mysql --datadir=/data/3309/data/ --basedir=/usr/local/mysql/
cp /opt/backup/my.cnf /data/3309/
chown mysql.mysql -R /data/3309/
mysqld_safe --defaults-file=/data/3309/my.cnf &    

mysql -S /tmp/mysql.sock4     #连接mysql查看数据
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> source /opt/backup/all_data-2015-10-01--39.sql
 
mysql> select * from test.test;   #还缺一个数据
+------+-------------+
| id   | comment     |
+------+-------------+
|    1 | yun zhonghe |
+------+-------------+
1 row in set (0.00 sec)  
 
mysql> source /tmp/incres-1.sql;
 
mysql> select * from test.test;   #数据已恢复
+------+--------------+
| id   | comment      |
+------+--------------+
|    1 | yun zhonghe  |
|    2 | yun zhonghe2 |
+------+--------------+
2 rows in set (0.00 sec)
 
mysql> set sql_log_bin = 1;  #打开二进制记录开关。

1.7小结,mysqldump适合于数据量较小的场合,它的优点是有众多选项,使用起来非常灵活,缺点是数据量一旦过大,非常耗时耗力。

 

2、使用lvm进行全备。

lvm快照卷原理参考

http://baike.baidu.com/link?url=iEpO_zm_AbHbk-ijQa8jNcFRoPPG2NdTYb_cRoQ7mjQb_ag9g-fL7yHPXV7Atp2j3J0L5xYynM9KKLIwycW_S_

2.1 数据接着上次继续开始。

2.2 全备。

需保证数据库存放在逻辑卷组上面,才行。

2.2.1首先锁表和滚动日志

mysql> flush table with read lock;
Query OK, 0 rows affected (0.02 sec)
 
mysql -S /tmp/mysql.sock4 -e 'show master status;' > /backup/master.info  #记录当前日志信息
mysqladmin -S /tmp/mysql.sock4 flush-logs   #滚动日志

2.2.2创建快照

lvcreate -s -n snap_data -L 500M /dev/vg_node5/mylv_data
  Logical volume "snap_data" created

2.2.3 解锁表

mysql> unlock tables;  
Query OK, 0 rows affected (0.00 sec)

2.2.4 复制快照卷数据到备份目录下

mkdir -p /backup/lvm
mount /dev/vg_node5/snap_data /mnt/lvm
cp -R /mnt/3309/* /backup/lvm

2.2.5 删除快照

umount /mnt
lvremove /dev/mapper/vg_node5-snap_data
Do you really want to remove active logical volume snap_data? [y/n]: y
  Logical volume "snap_data" successfully removed

2.3增量备份,只需和定时复制binlog到备份目录下面即可

2.4恢复,只需要直接拷贝备份目录下的文件即可

killall mysqld
rm -rf /data/3309/
cp -R /backup/lvm/ /data/3309/
chown mysql.mysql -R /data/3309/
mysqld_safe --defaults-file=/data/3309/my.cnf &
ss -tnl | grep 330
LISTEN     0      50                        *:3309                     *:* 
 
mysql> select * from test.test;   #数据未改变
+------+--------------+
| id   | comment      |
+------+--------------+
|    1 | yun zhonghe  |
|    2 | yun zhonghe2 |
+------+--------------+

2.5小结:

lvm实现物理备份速度相对mysqldump来比较快,实现也比较简单,是不错的选择。

缺点:数据目录必须存放在lvm卷组上面

 

3、使用xtrabackup实现热备。

请自行到官网下载并安装对应的rpm包。

使用方法参考:详细参考:

http://www.cnblogs.com/Amaranthus/archive/2014/08/19/3922570.html

3.1创建一个具有最小权限的用户

mkdir /backup/xtrabackup
mysql> grant RELOAD, LOCK TABLES, REPLICATION CLIENT on *.* to 'bkuser'@'localhost' identified by '123456';
mysql> flush privileges;

3.2完全热备。

使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAMMERGECSVARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

innobackupex --user=bkuser --password=123456 --socket=/tmp/mysql.sock4 --defaults-file=/data/3309/my.cnf /backup/xtrabackup/ #相关选项自行help。
#nnobackupex: completed OK! #出现此选项代表备份完成。
ls /backup/xtrabackup/
2015-10-01_17-00-13

(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

(4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf —— 备份命令用到的配置选项信息;

3.3提供改变数据。

mysql> insert into test.test values (3,'yun zhonghe3');
Query OK, 1 row affected (0.03 sec)

3.4增量备份

innobackupex --user=bkuser --password=123456 --socket=/tmp/mysql.sock4 --defaults-file=/data/3309/my.cnf --incremental /backup/xtrabackup/ --incremental-basedir=/backup/xtrabackup/2015-10-01_17-00-13/

3.5 模拟数据损坏

rm -rf /data/3309/
killall mysqld

3.6增量备份恢复

innobackupex --apply-log --redo-only /backup/xtrabackup/2015-10-01_17-00-13/
innobackupex --apply-log --redo-only /backup/xtrabackup/2015-10-01_17-00-13/ --incremental-dir=/backup/xtrabackup/2015-10-01_17-15-00/

#注意,多实例的话,仍然需要备份配置文件,启动的时候需要binlog目录。

mkdir -p /data/3309/{data,binlog}
chown mysql.mysql -R /data/
cp /opt/backup/my.cnf /data/3309/
innobackupex --copy-back /backup/xtrabackup/2015-10-01_17-00-13/ --defaults-file=/opt/backup/my.cnf   #恢复数据。

3.6启动数据库查看。

mysqld_safe --defaults-file=/data/3309/my.cnf &
mysql -S /tmp/mysql.sock4
mysql> select * from test.test;   #数据修复完成。
+------+--------------+
| id   | comment      |
+------+--------------+
|    1 | yun zhonghe  |
|    2 | yun zhonghe2 |
|    3 | yun zhonghe3 |
+------+--------------+
3 rows in set (0.01 sec)

小结:

xtrabacup具有如下特点。

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)能够基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快;

因此建议学会熟练使用xtrabackup进行备份和还原。

 

 

原创文章,作者:艾贺,如若转载,请注明出处:http://www.178linux.com/8528

(0)
艾贺艾贺
上一篇 2015-10-01
下一篇 2015-10-03

相关推荐

  • MySQL/MariaDB基础性知识及DDL操作详解

    前言 MySQL/MariaDB是一个开放源码的小型关联式数据库管理系统,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL/MariaDB作为网站数据库。 基础架构 MySQL核心组件 连接池:认证、线程重用、连接数限制、内存检查、缓存 SQL接口:DDL, DML, 关系型数据库的基本抽…

    Linux干货 2015-05-07
  • RAID有点意思

        独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。其基本思想就是把多个相对…

    Linux干货 2017-06-19
  • Redis集群明细文档

    Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式)。目前根据文档已经看到Redis正在开发集群功能,其中一部分已经开发完成,但是具体什么时候可以用上,还不得而知。文档来源:http://redis.io/topics/cluster-spec 一、介绍   该文档是…

    Linux干货 2015-04-04
  • shell脚本2

    使用read命令来接受输入 使用read来把输入值分配给一个或多个shell变量 read后面跟变量,回车输入内容,就可以把输入的内容赋给变量 -p指定要显示的提示 -s 静默输入,一般用于密码 输入的内容不显示 -n N 指定输入的字符长度N 当输入的内容达到了5个字符会直接结束输入 -d‘字符’ 输入结束符 把!作为了结束符,在输入内容时,当输入!会直接…

    2017-08-11
  • LVS-net模型

    net模型拓扑图 注:rip的网关需指向DIP 搭建LVS net模式 基于httpd服务 首先准备三台主机 主机A 主机B 主机C 主机A(vs主机) 主机A设置两个IP 一个内网一个外网 #yum -y install ipvsadm #echo 1 > /proc/sys/net/ipv4/ip_forward :打开核心转发功能 #iptabl…

    Linux干货 2017-05-17
  • bash编程初体验(三)

    bash编程初体验之for for while until 概述 本文将介绍以for为代表的循环语句在shell 脚本中的应用,常见的循环语句有for, while,until,作为循环语句,顾名思义,它就是重复地做一件事,直到满足某一条件而退出;另外,还有两个循环控制语句continue与break来配合循环语句,以实现临时中断或跳出循环的功能;以下为fo…

    Linux干货 2016-08-24