MySQL备份学习
备份分类
物理和逻辑备份
物理备份直接拷贝数据库目录和文件,适合数据量大、重要且需要在出现问题时快速恢复的数据库
逻辑备份保存信息包括逻辑数据库结构(数据库表的创建脚本)和内容(插入语句或者分隔符平面文件),适合数据量小或异构数据库数据迁移
本地备份和远程备份
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备份学习的更多相关文章
- mysql备份学习笔记及xtrabackup安装
(参考书籍:<深入浅出MySQL>) 一.备份恢复策略 a) 确定要备份的表的存储引擎是事务型还是非事务型 b) 确定使用全备份还是增量备份 c) 定期做备份 ...
- Linux学习系列之MySQL备份
MySQL排除表备份 #!/bin/bash #created by 90root #date: 20160809 date_y=$(date +%Y) date_m=$(date +%m) time ...
- MySQL备份还原——AutoMySQLBackup介绍
AutoMySQLBackup是一个开源的MySQL备份脚本.可以说它是一个轻量级的备份方案,AutoMySQLBackup的安装.配置非常简单.方便.AutoMySQLBackup的sourcefo ...
- MySQL备份可能遇到的坑
MySQL备份工具,支持各种参数选项,使用不同的选项极有可能影响备份处理过程.本文使用我们常规认为合理的备份参数,测试/验证是否存在容易忽视的坑 # 常规备份参数 # mysqldump shell& ...
- centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课
centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数 ...
- MySQl Study学习之--MySQl二进制日志管理
MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log) a.它包括的内容及作用例如以下: 包括了全部更新了数据或者已经潜在更新了数据(比方没 ...
- mysql深入学习(一)
Mysql高级学习 一.Mysql简介 1.概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同 ...
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- (4.16)mysql备份还原——物理备份之XtraBackup实践
关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...
随机推荐
- cassandra中对节点失败与否的探测方法, the Phi accrual Failure Dector,附论文
(1)在分布式系统中,对于某个节点是否还“活着”的探测,通常是设定一个时间的阀值,然后根据接收到的“心跳”信息的间隔,来判定这个节点是否还活着,然后返回一个bool值: 但这种做法很容易造成误判:因为 ...
- 三部曲一(搜索、数学)-1016-Code
Code Time Limit : 2000/1000ms (Java/Other) Memory Limit : 60000/30000K (Java/Other) Total Submissi ...
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- Flask生成SECRET_KEY(密钥)的一种简单方法
SECRET_KEY是Flask中比较重要的一个配置值.本文介绍一种比较简单的生成SECRET_KEY的方法. Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值,这是一 ...
- XML Schema的基本语法(转)
XML Schema的基本语法(转) XSDL(XML Schema定义语言)由元素.属性.命名空间和XML文档种的其他节点构成的. 一.XSD中的元素 XSD文档至少要包含:schema根元素和XM ...
- Spring使用——切面编程AOP使用
在我们的spring xml配置中,加上<aop:config>之后,Eclipse报错,提示The prefix "aop" for element "ao ...
- ListView中itemz中控件的点击事件和条目点击事件冲突
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- uva147 Dollars ——完全背包
link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- [NOIP2009] 靶形数独(搜索+剪枝)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [原创]cocos2d-x研习录-第三阶 特性之触屏
游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...