备份分类

物理和逻辑备份

物理备份直接拷贝数据库目录和文件,适合数据量大、重要且需要在出现问题时快速恢复的数据库

逻辑备份保存信息包括逻辑数据库结构(数据库表的创建脚本)和内容(插入语句或者分隔符平面文件),适合数据量小或异构数据库数据迁移

本地备份和远程备份

mysqldump可以通过本地和远程服务器,对于SQL输出(CREATE and INSERT语句),本地或者远程可以备份并在客户端生成文件。对于带分隔符的文本文件,数据文件只能在服务器主机上生成。

mysqlhotcopy只能在本地执行备份,执行时会锁住server防止数据更改,然后拷贝本地数据文件

select ... into outfile 可以在本地或者远程连接主机,但是输出文件在服务器端

物理备份在数据库服务器主机上让服务器离线,将文件拷贝到远程目标主机上

快照备份:基于操作系统的快照备份,MySQL本身不提供该功能

热备和冷备份

MySQL Enterprise Backup product使用物理备份整个实例或者所选的数据库、表等数据对象,支持增量、压缩备份,比逻辑备份要快,企业版支持

使用mysqldump或者mysqlhotcopy进行逻辑备份,mysqldump可以备份任何存储引擎类型的表,mysqlhotcopy支持部分类型存储引擎

备份方法介绍

mysqldump

表的导入导出

用 mysqldump 导出数据为文本。

mysqldump –u username –T target_dir dbname tablename [option]

其中 option 参数可以是以下选项:

--fields-terminated-by=name(字段分隔符);

--fields-enclosed-by=name(字段引用符);

--fields-optionally-enclosed-by=name(字段引用符,只用在char、 varchar 和text 等字符

型字段上);

--fields-escaped-by=name(转义字符);

--lines-terminated-by=name(记录结束符)。

使用 SELECT ...INTO OUTFILE ...命令来导出数据,具体语法如下。

mysql> SELECT * FROM tablename INTO OUTFILE 'target_file' [option];

其中 option 参数可以是以下选项:

FIELDS TERMINATED BY 'string' (字段分隔符,默认为制表符’\t’);

FIELDS [OPTIONALLY] ENCLOSED BY 'char'(字段引用符,如果加OPTIONALLY 选项则只用在char、

varchar 和text 等字符型字段上。默认不使用引用符);

FIELDS ESCAPED BY 'char' (转义字符,默认为’\’);

LINES STARTING BY 'string' (每行前都加此字符串,默认'');

LINES TERMINATED BY 'string'(行结束符,默认为’\n’);

使用“ LOAD DATA INFILE…”命令导入数据

mysql > LOAD DATA [LOCAL] INFILE ‘filename’ INTO TABLE tablename [option]

option 可以是以下选项:

FIELDS TERMINATED BY 'string'(字段分隔符,默认为制表符 '\t');

FIELDS [OPTIONALLY] ENCLOSED BY 'char'(字段引用符,如果加OPTIONALLY 选项则只用

在char、 varchar 和text 等字符型字段上。默认不使用引用符);

FIELDS ESCAPED BY 'char'(转义字符,默认为 '\');

LINES STARTING BY 'string'(每行前都加此字符串,默认 '');

LINES TERMINATED BY 'string'(行结束符,默认为 '\n');

IGNORE number LINES(忽略输入文件中的前 n 行数据);

(col_name_or_user_var,...) (按照列出的字段顺序和字段数量加载数据);

SET col_name = expr,... 将列做一定的数值转换后再加载。

用mysqlimport 来实现,具体命令如下。

shell>mysqlimport –u root –p*** [--LOCAL] dbname order_tab.txt [option]

其中 option 参数可以是以下选项:

--fields-terminated-by=name(字段分隔符);

--fields-enclosed-by=name(字段引用符);

--fields-optionally-enclosed-by=name(字段引用符,只用在char、 varchar 和text 等字符型字段上);

--fields-escaped-by=name(转义字符);

--lines-terminated-by=name(记录结束符);

-- ignore-lines=number(或略前几行)。

mysqldump备份和恢复实现
两个重要参数

--single-transaction:mysqldump利用该参数能够使导出的InnoDB存储引擎的表产生一致的状态,保证该会话的事务隔离级别是read repeat,看不到正在发生的改变,不会发生改变。配合--quick选项

通过拷贝方式备份数据库:在拷贝前,执行FLUSH TABLES tbl_list WITH READ LOCK;

--master-data

mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。默认情况下这个值是1;当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。

备份方法与策略

利用mysqldump做完全备份,用binlog日志通过flush log做增量备份

shell> mysqldump --single-transaction --flush-logs --master-data=2 \

--all-databases > backup_sunday_1_PM.sql

--flush-logs参数用于产生一个新的bin log日志文件

查看文件可以看到binary文件和偏移量信息:

-- Position to start replication or point-in-time recovery from

-- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;

恢复

shell> mysql < backup_sunday_1_PM.sql

shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql

定期对msyql做增量备份,必要时对bin log做备份,增量备份要使用flush logs或者mysqladmin flush-logs

基于时间点恢复

查看当前使用的binlog和日志偏移量:

mysql> SHOW BINARY LOGS;

mysql> SHOW MASTER STATUS;

先恢复到最近一次完整备份点:

mysql -uroot -p < 完整备份.sql

如果距离故障点有多个bin log产生,恢复方式:

shell> mysqlbinlog --stop-datetime="2005-04-20 9:59:59" binlog.000001 binlog.000002 > bin.log

跳过出错错误时间

shell> mysqlbinlog --start-datetime="2005-04-20 9:59:59" binlog.000001 binlog.000002 > bin.log

shell> mysql -u root -p  < bin.log

或者:如果有GTID全局事务号,建议加上--skip-gtids

shell> mysqlbinlog --skip-gtids binlog.000001 > /tmp/dump.sql

shell> mysqlbinlog --skip-gtids binlog.000002 >> /tmp/dump.sql

shell> mysql -u root -p -e "source /tmp/dump.sql"

基于binlog偏移量恢复,更准确

shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \

| mysql -u root -p

shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \

| mysql -u root -p

mysqlhotcopy

mysqlhotcopy只能备份MYISAM和ARCHIVE表,执行用户必须有RELOAD、SELECT、LOCK TABLES权限

shell> mysqlhotcopy db_name [/path/to/new_directory]

shell> mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory

对表可以应用正则表达式:

shell> mysqlhotcopy db_name./regex/

在应用正则表达式时 ,(“ ~”)表示取反:

shell> mysqlhotcopy db_name./~regex/

MyISAM表的维护和崩溃恢复

myisamchk会对MyISAM表做check,repair,optimize,analyze等操作

1、myisamchk检查表错误

myisamchk tbl_name

全部检查:myisamchk *.MYI

2、修复表

备份表

myisamchk -r tbl_name,如果失败使用myisamchk --safe-recover tbl_name

3、困难修复,通过.FRM修复

将数据文件移到安全位置

使用数据描述创建空的数据索引文件

shell> mysql db_name

mysql> SET autocommit=1;

mysql> TRUNCATE TABLE tbl_name;

mysql> quit

将旧文件拷贝会原位置

也可以使用REPAIR TABLE tbl_name USE_FRM,该过程会自动执行以上操作,但还是建议先备份

4、非常困难修复

如果当.frm描述文件都奔溃,如果有备份,直接从备份中获取然后从第三步开始执行

如果.frm备份都没有,那么只能通过回忆建表吧,然后建好后从第二步开始修复

MyISAM表的备份恢复策略:

定期检查myisam表

35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI

定期进行优化表:

OPTIMIZE tbl_name

也可以通过以下语句

myisamchk -r -s --sort-index --myisam_sort_buffer_size=16M */*.MYI

mysqldumper

安装

需要cmake 先安装cmake相关的包和cmake

yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel cmake

下载和解压不再说明,以下是安装过程

cmake .

make

原理图

如果备份的数据库都是innodb引擎的表,因为没有myisam表需要备份,那么flush table with read lock 将会很快释放,所以如果没有myisam表的备份,那么你几乎感觉不到读锁的存在。
再者,因为对myisam表备份需要表锁,所有mydumper会优先处理myisam表,记录myisam表个数,每处理一个myisam都原子操作数量减一,在myisam表都处理完毕后立即解锁,尽量减少锁定的时间,而不是在导出innodb表数据的时候还在lock myisam表。

mydumper参数介绍:
-B, --database 需要备份的库
-T, --tables-list 需要备份的表,用,分隔
-o, --outputdir 输出目录
-s, --statement-size Attempted size of INSERT statement in bytes, default 1000000
-r, --rows 试图分裂成很多行块表
-c, --compress 压缩输出文件
-e, --build-empty-files 即使表没有数据,还是产生一个空文件
-x, --regex 支持正则表达式
-i, --ignore-engines 忽略的存储引擎,用,分隔
-m, --no-schemas 不导出表结构
-k, --no-locks 不执行临时共享读锁 警告:这将导致不一致的备份
-l, --long-query-guard 长查询,默认60s
--kill-long-queries kill掉长时间执行的查询(instead of aborting)
-b, --binlogs 导出binlog
-D, --daemon 启用守护进程模式
-I, --snapshot-interval dump快照间隔时间,默认60s,需要在daemon模式下
-L, --logfile 日志文件
-h, --host
-u, --user
-p, --password
-P, --port
-S, --socket
-t, --threads 使用的线程数,默认4
-C, --compress-protocol 在mysql连接上使用压缩
-V, --version
-v, --verbose 更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
myloader参数介绍:
-d, --directory 导入备份目录
-q, --queries-per-transaction 每次执行的查询数量, 默认1000
-o, --overwrite-tables 如果表存在删除表
-B, --database 需要还原的库
-e, --enable-binlog 启用二进制恢复数据
-h, --host
-u, --user
-p, --password
-P, --port
-S, --socket
-t, --threads 使用的线程数量,默认4
-C, --compress-protocol 连接上使用压缩
-V, --version
-v, --verbose 更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
mydumper输出文件:
metadata:元数据 记录备份开始和结束时间,以及binlog日志文件位置。
table data:每个表一个文件
table schemas:表结构文件
binary logs: 启用--binlogs选项后,二进制文件存放在binlog_snapshot目录下
daemon mode:在这个模式下,有五个目录0,1,binlogs,binlog_snapshot,last_dump。
备份目录是0和1,间隔备份,如果mydumper因某种原因失败而仍然有一个好的快照,
当快照完成后,last_dump指向该备份。
使用案例
备份game库到/backup/01文件夹中,并压缩备份文件
mydumper -u root -p ### -h localhost -B game -c -o /backup/01
备份所有数据库,并备份二进制日志文件,备份至/backup/02文件夹
mydumper -u root -p ### -h localhost -o /backup/02
备份game.tb_player表,且不备份表结构,备份至/backup/03文件夹
mydumper -u root -p ### -h localhost -T tb_player -m -o /backup/03
还原
mysqlload -u root -p ### -h localhost -B game -d /backup/02
mydumper的less locking模式
mydumper使用--less-locking可以减少锁等待时间,此时mydumper的执行机制大致为主线程 FLUSH TABLES WITH READ LOCK (全局锁) Dump线程 START TRANSACTION WITH CONSISTENT SNAPSHOT; LL Dump线程 LOCK TABLES non-InnoDB (线程内部锁) 主线程UNLOCK TABLES LL Dump线程 dump non-InnoDB tables LL DUmp线程 UNLOCK non-InnoDB Dump线程 dump InnoDB tables

Percona XtraBackup

能过实现热备份和增量的物理备份

安装

yum percona-xtrabackup.x86_64(推荐)或者rpm安装

创建账号并赋予权限,

mysql> CREATE USER 'bkpuser' @'localhost' IDENTIFIED BY 's3cret';

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost' ;

mysql> FLUSH PRIVILEGES;

全备份过程

通过innobackupex进行全备

innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/

可选项:--no-timestamp 不会生成日期文件夹 --defaults-file:默认的mysql配置文件

准备一个完全备份:因为有未提交事务或者在日志中的事务需要重做,所以需要该步骤保证数据一致。

innobackupex --apply-log /path/to/BACKUP-DIR

可选项:--use-memory=4G 默认是100M

恢复一个完整备份

innobackupex --copy-back /path/to/BACKUP-DIR

输出信息:

innobackupex: Finished copying back files.

111225 01:08:13 innobackupex: completed OK!

chown -R mysql:mysql /var/lib/mysql

增量备份

先全量备份,查看xtrabackup_checkpoints:

cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1664186
last_lsn = 1664186
compact = 0
recover_binlog_info = 0

执行增量备份:

innobackupex --incremental 上次全量备份根目录 --incremental-basedir=上次全量备份生成的日期目录

cat  xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1664186
to_lsn = 1664186
last_lsn = 1664186
compact = 0
recover_binlog_info = 0

准备增量备份:不同于全量备份,只有提交的事务在事务上重放,这将合并全量备份和增量备份。未提交的事务必须回滚。

innobackupex --apply-log --redo-only 上次全量备份根目录 --incremental-dir=上次全量备份生成的日期目录

最后的增量备份,没有--redo-only

innobackupex --apply-log 上次全量备份根目录 --incremental-dir=上次增量备份生成的日期目录

最终备份的数据是在上次全量备份根目录

innobackupex --copy-back 上次全备目录

增量数据流备份

全备

本地备份:

innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ > incremental.xbstream

解包备份:

xbstream -x < incremental . xbstream

可以将本地备份和解包备份一起做:

innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ | /

ssh user@hostname " cat - | xbstream -x -C > /backup-dir/"

部分备份:

可以备份指定的数据库或者表,还原时通过导入表方式,而不是的--copy-back选项

可以通过--include正则表达式方式,也可以通过--table-file指定table,或者--databases指定数据库

innobackupex --include='^mydatabase[.]mytable' /path/to/backup

/tmp/tables.txt可以包括许多表名称,每一个表一个行

innobackupex --tables-file=/tmp/tables.txt /path/to/backup

innobackupex --databases="mydatabase.mytable mysql" /path/to/backup

恢复:

innobackupex --apply-log --export /path/to/partial/backup

同时支持压缩、加密备份

MySQL备份学习的更多相关文章

  1. mysql备份学习笔记及xtrabackup安装

    (参考书籍:<深入浅出MySQL>) 一.备份恢复策略 a)      确定要备份的表的存储引擎是事务型还是非事务型 b)      确定使用全备份还是增量备份 c)      定期做备份 ...

  2. Linux学习系列之MySQL备份

    MySQL排除表备份 #!/bin/bash #created by 90root #date: 20160809 date_y=$(date +%Y) date_m=$(date +%m) time ...

  3. MySQL备份还原——AutoMySQLBackup介绍

    AutoMySQLBackup是一个开源的MySQL备份脚本.可以说它是一个轻量级的备份方案,AutoMySQLBackup的安装.配置非常简单.方便.AutoMySQLBackup的sourcefo ...

  4. MySQL备份可能遇到的坑

    MySQL备份工具,支持各种参数选项,使用不同的选项极有可能影响备份处理过程.本文使用我们常规认为合理的备份参数,测试/验证是否存在容易忽视的坑 # 常规备份参数 # mysqldump shell& ...

  5. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  6. MySQl Study学习之--MySQl二进制日志管理

    MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log)   a.它包括的内容及作用例如以下:     包括了全部更新了数据或者已经潜在更新了数据(比方没 ...

  7. mysql深入学习(一)

    Mysql高级学习 一.Mysql简介 1.概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同 ...

  8. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  9. (4.16)mysql备份还原——物理备份之XtraBackup实践

    关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...

随机推荐

  1. UIkit框架之UISegmentedControl

    1.继承链:UIcontrol:UIview:uiresponder:NSObject 2.初始化 (1)- (instancetype)initWithItems:(NSArray *)items ...

  2. Maven安装本地jar

    应用场景: 有时候一些jar包(比如oracle 的 ojdbc.jar)由于种种原因,比如版权等,导致maven中央库没有该jar文件,但是却有该jar的pom文件. 这个时候,如果私服也没这jar ...

  3. HDU 4251 --- 主席树(划分树是正解)

    题意:查询区间中位数 思路:模板题,相当于区间第K大的数,主席树可以水过,但划分树是正解.但还没搞明白划分树,先上模板 #include <iostream> #include <c ...

  4. Valgrind的多线程调试工具

    Valgrind的多线程调试工具  Helgrind是Valgrind的一个重点功能 本节主要针对与多线程基本安全问题进行检测:[所有的代码环境都是在POSIX_THREAD模式下] 写线程代码时 经 ...

  5. java类型转化之SimpleDateFormat-时间转化

    关于Date,时间戳(long),String类型之间的相互转换,主要是用到类SimpleDateFormat. 先介绍SimpleDateFormat类的一些常见格式: 1.参数: code des ...

  6. 关于debug时的一些操作

    当进入一个for循环时,想要看i==49或者其它的行,可以进行如下操作: 在for循环中打断点,点击鼠标右键,选择如下: 在弹出的页面中选择Breakpoint Properties,输入i==49, ...

  7. 数论 UVA 10780

    数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1 ...

  8. LeetCode() Min Stack 不知道哪里不对,留待。

    class MinStack { public: MinStack() { coll.resize(2); } void push(int x) { if(index == coll.size()-1 ...

  9. JavaBean用JSP调用和使用JSP动作标签的区别

    javabean的类可以用jsp动作标签实例化并使用. <!-- 下面这句是对Javabean类person的引用,引用的实例是p2 --> <jsp:useBean id=&quo ...

  10. Spring源码学习之:ClassLoader学习(3)

    ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回 这个类的class对象. 1.1 几个相关概念Clas ...