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 ...
随机推荐
- UIkit框架之UISegmentedControl
1.继承链:UIcontrol:UIview:uiresponder:NSObject 2.初始化 (1)- (instancetype)initWithItems:(NSArray *)items ...
- Maven安装本地jar
应用场景: 有时候一些jar包(比如oracle 的 ojdbc.jar)由于种种原因,比如版权等,导致maven中央库没有该jar文件,但是却有该jar的pom文件. 这个时候,如果私服也没这jar ...
- HDU 4251 --- 主席树(划分树是正解)
题意:查询区间中位数 思路:模板题,相当于区间第K大的数,主席树可以水过,但划分树是正解.但还没搞明白划分树,先上模板 #include <iostream> #include <c ...
- Valgrind的多线程调试工具
Valgrind的多线程调试工具 Helgrind是Valgrind的一个重点功能 本节主要针对与多线程基本安全问题进行检测:[所有的代码环境都是在POSIX_THREAD模式下] 写线程代码时 经 ...
- java类型转化之SimpleDateFormat-时间转化
关于Date,时间戳(long),String类型之间的相互转换,主要是用到类SimpleDateFormat. 先介绍SimpleDateFormat类的一些常见格式: 1.参数: code des ...
- 关于debug时的一些操作
当进入一个for循环时,想要看i==49或者其它的行,可以进行如下操作: 在for循环中打断点,点击鼠标右键,选择如下: 在弹出的页面中选择Breakpoint Properties,输入i==49, ...
- 数论 UVA 10780
数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1 ...
- LeetCode() Min Stack 不知道哪里不对,留待。
class MinStack { public: MinStack() { coll.resize(2); } void push(int x) { if(index == coll.size()-1 ...
- JavaBean用JSP调用和使用JSP动作标签的区别
javabean的类可以用jsp动作标签实例化并使用. <!-- 下面这句是对Javabean类person的引用,引用的实例是p2 --> <jsp:useBean id=&quo ...
- Spring源码学习之:ClassLoader学习(3)
ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回 这个类的class对象. 1.1 几个相关概念Clas ...