Mysql备份方案总结性梳理

 
 

mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案:

一、binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志~~
1.binlog日志内容
1)引起mysql服务器改变的任何操作。
2)复制功能依赖于此日志。
3)slave服务器通过复制master服务器的二进制日志完成主从复制,在执行之前保存于中继日志(relay log)中。 
4)slave服务器通常可以关闭二进制日志以提升性能。

2.binlog日志文件的文件表现形式
1)默认在安装目录下,存在mysql-bin.00001, mysql-bin.00002的二进制文件(binlog日志文件名依据my.cnf配置中的log-bin参数后面的设置为准)
2)还有mysql-bin.index用来记录被mysql管理的二进制文件列表
3)如果需要删除二进制日志时,切勿直接删除二进制文件,这样会使得mysql管理混乱。

3.binlog日志文件查看相关mysql命令
1)SHOW MASTER STATUS ; 查看正在使用的二进制文件 
MariaDB [(none)]> SHOW MASTER STATUS ; 
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 245 | | |
+------------------+----------+--------------+------------------+
2)FLUSH LOGS; 手动滚动二进制日志
MariaDB [(none)]> FLUSH LOGS; 
MariaDB [(none)]> SHOW MASTER STATUS ; 
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 245 | | |
+------------------+----------+--------------+------------------+
滚动以后,mysql重新创建一个新的日志mysql-bin.000004
3)SHOW BINARY LOGS 显示使用过的二进制日志文件
MariaDB [(none)]> SHOW BINARY LOGS ; 
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 30373 |
| mysql-bin.000002 | 1038814 |
| mysql-bin.000003 | 288 |
| mysql-bin.000004 | 245 |
4)SHOW BINLOG EVENTS 以表的形式查看二进制文件
命令格式:SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] 
MariaDB [(none)]> SHOW BINLOG EVENTS IN 'mysql-bin.000001' \G;
*************************** 99. row ***************************
Log_name: mysql-bin.000001
Pos: 30225
Event_type: Query
Server_id: 1
End_log_pos: 30354
Info: use `mysql`; DROP TEMPORARY TABLE `tmp_proxies_priv` /* generated by server */

4.MySQL二进制文件读取工具mysqlbinlog 
命令格式:mysqlbinlog [参数] log-files 
有以下四种参数选择: 
--start-datetime
--stop-datetime
--start-position
--stop-position
[root@test-huanqiu ~]# mysqlbinlog --start-position 30225 --stop-position 30254 mysql-bin.000001 
截取一下结果: 
# at 30225
#151130 12:43:35 server id 1 end_log_pos 30354 Querythread_id=1exec_time=0error_code=0
use `mysql`/*!*/;
SET TIMESTAMP=1448858615/*!*/;
SET @@session.pseudo_thread_id=1/*!*/

根据以上截取结果第二行,进行解释二进制日志内容 
1)时间点: 151130 12:43:35
2)服务器ID: server id 1
服务器ID主要用于标记日志产生的服务器,主要用于双主模型中,互为主从,确保二进制文件不会被相互循环复制
3)记录类型: Query 
4) 线程号: thread_id = 1 
5) 语句的时间戳和写入二进制日志文件的时间差; exec_time=0 
6) 事件内容
7)事件位置 #at 30225 
8) 错误代码 error_code=0 
9) 事件结束位置 end_log_pos也就是下一事件开始的位置

5.二进制日志格式
由bin_log_format={statement|row|mixed}定义 
1)statement: 基于语句,记录生成数据的语句 
缺点在于如果当时插入信息为函数生成,有可能不同时间点执行结果不一样,
例如: INSERT INTO t1 VALUE (CURRENT_DATE());
2)row: 基于行数据
缺点在于,有时候数据量会过大
3)mixed: 混合模式,又mysql自行决定何时使用statement, 何时使用row 模式

6.二进制相关参数总结
1)log_bin = {ON|OFF} 
还可以是个文件路径,自定义binlog日志文件名,使用“log_bin=“或“log-bin=“都可以,主要用于控制全局binlog的存放位置和是否开启binlog日志功能。
比如:log_bin=mysql-bin 或者 log-bin=mysql-bin,这样binlog日志默认会和mysql数据放在同一目录下。
2) log_bin_trust_function_creators
是否记录在
3) sql_log_bin = {ON|OFF}
会话级别是否关闭binlog, 如果关闭当前会话内的操作将不会记录
4) sync_binlog 是否马上同步事务类操作到二进制日志中
5) binlog_format = {statement|row|mixed} 二进制日志的格式,上面单独提到了
6) max_binlog_cache_size = 
二进制日志缓冲空间大小,仅用于缓冲事务类的语句;
7) max_binlog_stmt_cache_size =
语句缓冲,非事务类和事务类共用的空间大小
8) max_binlog_size = 
二进制日志文件上限,超过上限后则滚动
9) 删除二进制日志 
命令格式:PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
MariaDB> PURGE BINARY LOGS TO 'mysql-bin.010'; 
MariaDB> PURGE BINARY LOGS BEFORE '2016-11-02 22:46:26';
建议:切勿将二进制日志与数据文件放在一同设备;可以将binlog日志实时备份到远程设备上,以防出现机器故障进行数据恢复;

二、接下来说下binlog二进制日志备份和恢复
1.为什么做备份:
(1)灾难恢复 
(2)审计,数据库在过去某一个时间点是什么样的 
(3)测试

2.备份的目的:
(1)用于恢复数据
(2)备份结束后,需要周期性的做恢复测试

3.备份类型: 
(1)根据备份时,服务器是否在线
1)冷备(cold backup): 服务器离线,读写操作都不能进行 
2)温备份: 全局施加共享锁,只能读不能写
3)热备(hot backup):数据库在线,读写照样进行 
(2)根据备份时的数据集分类 
1)完全备份(full backup)
2)部分备份(partial backup)
(3)根据备份时的接口
1)物理备份(physical backup):直接复制数据文件 ,打包归档
特点: 
不需要额外工具,直接归档命令即可,但是跨平台能力比较差;如果数据量超过几十个G,则适用于物理备份
2)逻辑备份(logical backup): 把数据抽取出来保存在sql脚本中
特点: 
可以使用文本编辑器编辑;导入方便,直接读取sql语句即可;逻辑备份恢复时间慢,占据空间大;无法保证浮点数的精度;恢复完数据库后需要重建索引。
(4)根据备份整个数据还是变化数据 
1) 全量备份 full backup
2) 增量备份 incremental backup 
在不同时间点起始备份一段数据,比较节约空间;针对的是上一次备份后有变化的数据,备份数据少,备份快,恢复慢
3) 差异备份 differential backup 
备份从每个时间点到上一次全部备份之间的数据,随着时间增多二增多;比较容易恢复;对于很大的数据库,可以考虑主从模型,备份从服务器的内容。针对的是上一次全量备份后有变化的数据,备份数据多,备份慢,恢复快。
(5)备份策略,需要考虑因素如下
备份方式 
备份实践
备份成本
锁时间
时长
性能开销
恢复成本
恢复时长
所能够容忍丢失的数据量
(6)备份内容 
1)数据库中的数据
2)配置文件 
3)mysql中的代码: 存储过程,存储函数,触发器
4)OS 相关的配置文件,chrontab 中的备份策略脚本
5)如果是主从复制的场景中: 跟复制相关的信息
6)二进制日志文件需要定期备份,一旦发现二进制文件出现问题,需马上对数据进行完全备份

(7)Mysql最常用的三种备份工具:
1)mysqldump:
通常为小数据情况下的备份
innodb: 热备,温备
MyISAM, Aria: 温备 
单线程备份恢复比较慢
2)Xtrabackup(通常用innobackupex工具):
备份mysql大数据
InnoDB热备,增量备份;
MyISAM温备,不支持增量,只有完全备份 
属于物理备份,速度快;
3)lvm-snapshot:
接近于热备的工具:因为要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁;
使用cp、tar等工具进行物理备份;
备份和恢复速度较快;
很难实现增量备份,并且请求全局需要等待一段时间,在繁忙的服务器上尤其如此;

除此之外,还有其他的几个备份工具:
-->mysqldumper: 多线程的mysqldump 
-->SELECT clause INTO OUTFILE '/path/to/somefile' LOAD DATA INFILE '/path/from/somefile'
部分备份工具, 不会备份关系定义,仅备份表中的数据;
逻辑备份工具,快于mysqldump,因为不备份表格式信息
-->mysqlhotcopy: 接近冷备,基本没用

mysqldump工具基本使用
1. mysqldump [OPTIONS] database [tables…]
还原时库必须存在,不存在需要手动创建
    --all-databases: 备份所有库 
    --databases db1 db2 ...: 备份指定的多个库,如果使用此命令,恢复时将不用手动创建库。或者是-B db1 db2 db3 ....
    --lock-all-tables:请求锁定所有表之后再备份,对MyISAM、InnoDB、Aria做温备
    --lock-table: 对正在备份的表加锁,但是不建议使用,如果其它表被修改,则备份后表与表之间将不同步
    --single-transaction: 能够对InnoDB存储引擎实现热备;
启动一个很大的大事物,基于MOCC可以保证在事物内的表版本一致
自动加锁不需要,再加--lock-table, 可以实现热备
备份代码:
   --events: 备份事件调度器代码
   --routines: 备份存储过程和存储函数
   --triggers:备份触发器
备份时滚动日志:
   --flush-logs: 备份前、请求到锁之后滚动日志;
方恢复备份时间点以后的内容
复制时的同步位置标记:主从架构中的,主服务器数据。效果相当于标记一个时间点。
   --master-data=[0|1|2]
   0: 不记录
   1:记录为CHANGE MASTER语句
   2:记录为注释的CHANGE MASTER语句

2. 使用mysqldump备份大体过程:
1) 请求锁:--lock-all-tables或使用–singe-transaction进行innodb热备;
2) 滚动日志:--flush-logs
3) 选定要备份的库:--databases
4) 记录二进制日志文件及位置:--master-data=
FLUSH TABLES5 WITH READ LOCK;

3. 恢复:
恢复过程无需写到二进制日志中 
建议:关闭二进制日志,关闭其它用户连接;

4. 备份策略:基于mysqldump
备份:mysqldump+二进制日志文件;(“mysqldump >”)
周日做一次完全备份:备份的同时滚动日志
周一至周六:备份二进制日志;
恢复:(“mysql < ”)或在mysql数据库中直接执行“source sql备份文件;”进行恢复。如果sql执行语句比较多,可以将sql语句放在一个文件内,将文件名命名为.sql结尾,然后在mysql数据库中使用"source 文件.sql;"命令进行执行即可!
完全备份+各二进制日志文件中至此刻的事件

5. 实例说明:
参考:Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

lvm-snapshot:基于LVM快照的备份
1.关于快照:
1)事务日志跟数据文件必须在同一个卷上;
2)刚刚创立的快照卷,里面没有任何数据,所有数据均来源于原卷
3)一旦原卷数据发生修改,修改的数据将复制到快照卷中,此时访问数据一部分来自于快照卷,一部分来自于原卷
4)当快照使用过程中,如果修改的数据量大于快照卷容量,则会导致快照卷崩溃。 
5)快照卷本身不是备份,只是提供一个时间一致性的访问目录。

2.基于快照备份几乎为热备: 
1)创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁;
2)如果是Inoodb引擎, 当flush tables 后会有一部分保存在事务日志中,却不在文件中。 因此恢复时候,需要事务日志和数据文件
但释放锁以后,事务日志的内容会同步数据文件中,因此备份内容并不绝对是锁释放时刻的内容,由于有些为完成的事务已经完成,但在备份数据中因为没完成而回滚。 因此需要借助二进制日志往后走一段

3.基于快照备份注意事项: 
1)事务日志跟数据文件必须在同一个卷上;
2)创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁;
3)请求全局锁完成之后,做一次日志滚动;做二进制日志文件及位置标记(手动进行);

4.为什么基于MySQL快照的备份很好?
原因如下几点:
1)几乎是热备 在大多数情况下,可以在应用程序仍在运行的时候执行备份。无需关机,只需设置为只读或者类似只读的限制。
2)支持所有基于本地磁盘的存储引擎 它支持MyISAM, Innodb, BDB,还支持 Solid, PrimeXT 和 Falcon。
3)快速备份 只需拷贝二进制格式的文件,在速度方面无以匹敌。
4)低开销 只是文件拷贝,因此对服务器的开销很细微。
5)容易保持完整性 想要压缩备份文件吗?把它们备份到磁带上,FTP或者网络备份软件 -- 十分简单,因为只需要拷贝文件即可。
6)快速恢复 恢复的时间和标准的MySQL崩溃恢复或数据拷贝回去那么快,甚至可能更快,将来会更快。
7)免费 无需额外的商业软件,只需Innodb热备工具来执行备份。

快照备份mysql的缺点:
1)需要兼容快照 -- 这是明显的。
2)需要超级用户(root) 在某些组织,DBA和系统管理员来自不同部门不同的人,因此权限各不一样。
3)停工时间无法预计,这个方法通常指热备,但是谁也无法预料到底是不是热备 -- FLUSH TABLES WITH READ LOCK 可能会需要执行很长时间才能完成。
4)多卷上的数据问题 如果你把日志放在独立的设备上或者你的数据库分布在多个卷上,这就比较麻烦了,因为无法得到全部数据库的一致性快照。不过有些系统可能能自动做到多卷快照。

5.备份与恢复的大体步骤
备份:
1)请求全局锁,并滚动日志
mysql> FLUSH TABLES WITH READ LOCK;
mysql> FLUSH LOGS;
2)做二进制日志文件及位置标记(手动进行);
[root@test-huanqiu ~]# mysql -e 'show master status' > /path/to/orignal_volume
3)创建快照卷
[root@test-huanqiu ~]# lvcreate -L -s -n -p r /path/to/some_lv
4)释放全局锁
5)挂载快照卷并备份
6)备份完成之后,删除快照卷

恢复:
1)二进制日志保存好;
提取备份之后的所有事件至某sql脚本中;
2)还原数据,修改权限及属主属组等,并启动mysql
3)做即时点还原
4)生产环境下, 一次大型恢复后,需要马上进行一次完全备份。

备份与恢复实例说明: 
环境, 实现创建了一个test_vg卷组,里面有个mylv1用来装mysql数据,挂载到/data/mysqldata

备份实例:
1. 创建备份专用的用户,授予权限FLUSH LOGS 和 LOCK TABLES 
MariaDB > GRANT RELOAD,LOCK TABLES,SUPER ON *.* TO 'lvm'@'192.168.1.%' IDENTIFIED BY 'lvm'; 
MariaDB > FLUSH PRIVILEGES;

2. 记录备份点
[root@test-huanqiu ~]# mysql -ulvm -h192.168.1.10 -plvm -e 'SHOW MASTER STATUS' > /tmp/backup_point.txt

3. 创建快照卷并挂载快照卷
[root@test-huanqiu ~]# lvcreate -L 1G -s -n lvmbackup -p r /dev/test_vg/mylv1 
[root@test-huanqiu ~]# mount -t ext4 /dev/test_vg/lvmbackup /mnt/

4. 释放锁
[root@test-huanqiu ~]# mysql -ulvm -h192.168.98.10 -plvm -e 'UNLOCK TABLES' 
做一些模拟写入工作 
MariaDB [test]> create database testdb2

5. 复制文件
[root@test-huanqiu ~]# cp /data/mysqldata /tmp/backup_mysqldata -r

6. 备份完成卸载,删除快照卷 
[root@test-huanqiu ~]# umount /mnt 
[root@test-huanqiu ~]# lvmremove /dev/test_vg/lvmbackup

还原实例: 
假如整个mysql服务器崩溃,并且目录全部被删除

1. 数据文件复制回源目录
[root@test-huanqiu ~]# cp -r /tmp/backup_mysqldata/* /data/mysqldata/ 
MariaDB [test]> show databases ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| mysqldata |
| openstack |
| performance_schema |
| test |
+--------------------+
此时还没有testdb2, 因为这个是备份之后创建的,因此需要通过之前记录的二进制日志

2. 查看之前记录的记录点。向后还原
[root@test-huanqiu ~]# cat /tmp/backup_point.txt 
FilePositionBinlog_Do_DBBinlog_Ignore_DB
mysql-bin.000001245
[root@test-huanqiu ~]# mysqlbinlog /data/binlog/mysql-bin.000001 --start-position 245 > tmp.sql
MariaDB [test]> source /data/mysqldata/tmp.sql 
MariaDB [test]> show databases ; 
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| mysqldata |
| openstack |
| performance_schema |
| test |
| testdb2 |
+--------------------+
8 rows in set (0.00 sec)
testdb2 已经被还原回来。

具体实例说明,参考:Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

使用Xtrabackup进行MySQL备份:

参考:Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录

--------------------------------------------------------------------------------------
关于备份和恢复的几点经验之谈

备份注意:
1. 将数据和备份放在不同的磁盘设备上;异机或异地备份存储较为理想;
2. 备份的数据应该周期性地进行还原测试;
3. 每次灾难恢复后都应该立即做一次完全备份;
4. 针对不同规模或级别的数据量,要定制好备份策略;
5. 二进制日志应该跟数据文件在不同磁盘上,并周期性地备份好二进制日志文件;

从备份中恢复应该遵循步骤:
1. 停止MySQL服务器;
2. 记录服务器的配置和文件权限;
3. 将数据从备份移到MySQL数据目录;其执行方式依赖于工具;
4. 改变配置和文件权限;
5. 以限制访问模式重启服务器;mysqld的--skip-networking选项可跳过网络功能;
方法:编辑my.cnf配置文件,添加如下项:
skip-networking
socket=/tmp/mysql-recovery.sock
6. 载入逻辑备份(如果有);而后检查和重放二进制日志;
7. 检查已经还原的数据;
8. 重新以完全访问模式重启服务器;
注释前面第5步中在my.cnf中添加的选项,并重启;

Mysql备份方案总结性梳理的更多相关文章

  1. Mysql备份系列(1)--备份方案总结性梳理

    mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...

  2. MySQL备份方案-->(利用mysqldump以及binlog二进制日志)

                                                         MySQL备份方案-->(利用mysqldump以及binlog二进制日志) 随着数据不 ...

  3. XtraBackup物理备份 阿里云的Mysql备份方案

    XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBac ...

  4. MySQL备份方案

    下面将分别模拟不同场景数据库宕机解决方案:这里应用到的技术分别为innobackuper及binlog日志来进入还原数据 一.主从库情况下(为了不影响主库的性能,备份都放在从库上进行)当主库宕机时,如 ...

  5. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  6. Mysql优化系列(0)--总结性梳理

    对于一个网站来说,在运行很长一段时间后,数据库瓶颈问题会越来越暴露出来.作为运维人员,对数据库做必要的优化十分重要!下面总结以往查阅到的以及自己工作中的一些优化操作经验,并根据OSI七层模型从下往上进 ...

  7. mysql高可用方案总结性说明

    MySQL的各种高可用方案,大多是基于以下几种基础来部署的(也可参考:Mysql优化系列(0)--总结性梳理   该文后面有提到)1)基于主从复制:2)基于Galera协议(PXC):3)基于NDB引 ...

  8. Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...

  9. MySQL常见备份方案

    MySQL常见备份方案有以下三种: mysqldump + binlog lvm + binlog xtrabackup 本例为方便演示,数据库里面数据为空.下面开始动手 mkdir /opt/bac ...

随机推荐

  1. Base64补充

    1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件. 65字 ...

  2. java基础-抽象类与接口(转)

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类    ...

  3. hr虚线

    转载请注明来源:https://www.cnblogs.com/hookjc/ <hr size="1" noshade="noshade" style= ...

  4. DbUnit入门实战

    原文地址: http://yangzb.iteye.com/blog/947292 相信做过单元测试的人都会对JUnit 非常的熟悉了, 今天要介绍的DbUnit(http://dbunit.sour ...

  5. js金额转中文大写

    基础参数: var AIW_number = {0:'零', 1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖'} var AI ...

  6. Mybatis的介绍和基本使用

    巨人的肩膀 Mybatis的介绍和基本使用(1) (qq.com) Mybatis SQL映射文件详解(2) (qq.com)

  7. 关于Untiy破解 for Mac

    Mac的破解很简单 也很坑 如果你破解过win的 在进行Mac版的破解 可能认为三观都被颠覆了 以下进行下讲解 并且帮助大家排除坑 还是那句话  有条件的请支持正版  破解版只进行技术分享 第一步去u ...

  8. 树莓派PICO刷入MicroPython内核的两种方式

    一.MicroPython简介 MicroPython 是 Python 3编程语言的精简高效实现,其中包括 Python 标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行. 可以在 25 ...

  9. oracle-11G转10G

    先查询directory的地址 导出的文件必须放在此目录select * from dba_directories;找到directory_name的值 ,也可以新建一个create director ...

  10. Devops 开发运维高级篇之微服务代码上传和代码检查

    Devops 开发运维高级篇之微服务代码上传和代码检查 微服务持续集成(1)-项目代码上传到Gitlab 微服务持续集成(2)-从Gitlab拉取项目源码 微服务持续集成(3)-提交到SonarQub ...