一.安装教程
1.XtraBackup简介
XtraBackup有很多功能和优点:例如支持全备、增量备份、部分备份;支持压缩备份;备份不影响数据读写、事务等,但是也有缺陷不足:例如不支持脱机备份、不支持直接备份到磁带设备、不支持Cloud Back,MyISAM的备份也会阻塞。XtraBackup只支持Linux平台。
2.安装包
将percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz拷贝至linux机器/wind下
拷贝包
lib64numa1-2.0.3-4-mdv2011.0.x86_64.rpm(依赖包)
DBD-mysql-4.043.tar.gz(依赖包)
DBI-1.639.tar.gz (依赖包)
percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
解压包
tar –zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
rpm –ivh lib64numa1-2.0.3-4-mdv2011.0.x86_64.rpm
tar –zxvf DBI-1.639.tar.gz
(安装DBI教程)
http://blog.sina.com.cn/s/blog_a32eff280102vmpn.html
perlMakefile.PL
make
make test
make install
./list.pl
tar –zxvf DBD-mysql-4.043.tar.gz
在percona-xtrabackup-2.4.9-Linux-x86_64/bin下输入inno+TAB
若能补全命令innobackupex则安装成功
二.使用教程
1.全量备份
./innobackupex --defaults-file=/etc/my.cnf--user=windin --password=windin --host=10.202.16.13 /wind/zyd/mysqlback/full --no-timestamp
--defaults-file=/etc/my.cnf ——mysql的配置文件
--user=windin——用户名 --password 密码 --host 机器ip
/wind/zyd/mysqlback/full——备份文件的目录
--no-timestamp ——不使用默认的时间目录
2.全量还原
(1)关闭数据库
service mysqld stop
(2)全备下的文件夹必须为空
mv /wind/mysql/data /wind/mysql/data_bak
(3)利用 --apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
./innobackupex --apply-log /wind/zyd/mysqlback/full
(4)拷贝备份至data目录下.
if
/innobackupex--defaults-file=/etc/my.cnf --copy-back--rsync /wind/zyd/mysqlback/full
else
cp -r /wind/zyd/mysqlback/full/* /wind/mysql/data
(5)权限修改chown -R mysql:users /wind/mysql/data2
3.增量备份
(1)全表备份————备份时占用资源大小,速度
./innobackupex --defaults-file=/etc/my.cnf --user=windin--password=windin --host=10.202.16.13 /wind/zyd/mysqlback/full --no-timestamp
(2)增量备份
指定数据库备份
./innobackupex --defaults-file=/etc/my.cnf --user=windin--password=windin --host=10.202.16.13 --databases="xtra_db" --incremental-basedir=/wind/zyd/mysqlback/full --incremental/wind/zyd/mysqlback/incremental --no-timestamp
4.增量还原
(1)关闭数据库
service mysqld stop
全量数据日志回滚操作日志记录
(2)全量备份回滚记录
./innobackupex --apply-log --redo-only /wind/zyd/mysqlback/full
说明:指定全备目录,--redo-only 对已提交的事务进行前滚,仅最后一次增备恢复不需要添加该参数
(3)增量备份回滚操作日志记录合并
./innobackupex --apply-log /wind/zyd/mysqlback/full --incremental-dir=/wind/zyd/mysqlback/incremental
##最后再prepare全量备份
##./innobackupex --apply-log /wind/zyd/mysqlback/full
(4)全量数据导入mysql
cp /wind/zyd/mysqlback/full/*/wind/mysql/data
./innobackupex --copy-back /wind/zyd/mysqlback/full
(5)权限修改chown -Rmysql:mysql /var/lib/mysql/bak/
注意:-defaults-file 放在首位
--user 数据库用户名
--passw 数据库密码
--host 数据库机器ip
--databases 数据库名
/zyd/mysqlback 拷贝文件的路径
三.性能测试
1.全量备份速度
开发站测试数据量10G 大约150S 2min半 60M/s
10.20.5.64主站数据量2.3T 183M/s 3.5小时
2.全量恢复速度
开发站测试数据量10G 大约210S 3min半 每秒大约0.05G
10.20.5.64主站数据量2.3T 183M/s 5.5小时
四.应用场景
1.msyqldump和xtrabackup工具优缺点对比分析
mysqldump工具
数据量100G 所需时间13h
优点:对于单表或少表使用方便,风险小,不需要全实例替换。
缺点:对于多表或全实例使用复杂,耗时长。
xtrabackup工具
数据量2.3T 所需时间9h
优点:对于全实例使用方便,耗时短。
缺点:对于单表使用代价高,风险大。
2.大数据同步方案优化
1)采用xtrabackup工具
对于超过150G大小的数据同步时
需要进行全实例搬迁时(如SSD老化,更换实例机器等)
2)采用mysqldump工具
对于小于150G大小的数据同步时
五.通过表空间传输
1.操作步骤
1).在source server A上,创建一个表
mysql> use test;
mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
2).在destination server B上,也创建同样的表结构
mysql> use test;
mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
3).在destination server B上,discard 该表(这一步是必须的)
mysql> ALTER TABLE t DISCARD TABLESPACE;
4).在source server A上,执行 FLUSH TABLES ... FOR EXPORT, 该表这时候处于quiesce状态,只读,且创建.cfg metadata文件
mysql> use test;
mysql> FLUSH TABLES t FOR EXPORT;
此时,.cfg 文件在InnoDB的data directory中
5).拷贝.ibd & .cfg 从.TRG文件(ource server A 到 在destinationserver B
shell> scp /path/to/datadir/test/t.{ibd,cfg}destination-server:/path/to/datadir/test
6).在source server A, 执行unlocktables 来释放FLUSHTABLES ... FOR EXPORT 加的locks
mysql> use test;
mysql> UNLOCK TABLES;
7).在destinationserver B上,导入tablespace
mysql> use test;
mysql> ALTER TABLE t IMPORT TABLESPACE;
2.使用xtrabackup优化方法
原生的方式适合小范围导出,比如一两个表.如果导出的表很多,可以用innobackupex行辅助,并且innobackupex没有锁,不影响线上的业务.具体方法见第二章。然后将ibd文件,cfg文件和TRG文件拷贝到目标实例数据库。
最后在目标实例执行alter table 表名 import tablespace;
3.性能比较
这几步中,最慢的是import,其他几乎是瞬间完成。但是,因为是直接拷贝表文件,所以比mysqldump要快很多。
4.留存问题
表中中文传输后存在中文乱码问题。待研究。
先查看数据库的编码然后全部改为utf8
show variableslike 'character%';
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
具体性能需要进一步测试。
以下是一个例子。
show create table tb_object_0088;
CREATE TABLE "test"."tb_object_0088" (
"SEQID"decimal(10,0) NOT NULL,
"OB_OBJECT_ID"varchar(38) CHARACTER SET utf8 NOT NULL,
"PROGRESS"varchar(1) CHARACTER SET utf8 DEFAULT NULL,
"RP_GEN_DATETIME"datetime NOT NULL,
"RP_ACTION"varchar(1) CHARACTER SET utf8 DEFAULT NULL,
"F1_0088"varchar(10) CHARACTER SET utf8 NOT NULL,
"F2_0088"varchar(100) CHARACTER SET utf8 NOT NULL,
"F3_0088"varchar(8) CHARACTER SET utf8 NOT NULL,
"F4_0088"varchar(8) CHARACTER SET utf8 NOT NULL,
"F5_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F6_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F7_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F8_0088"varchar(200) CHARACTER SET utf8 DEFAULT NULL,
"F9_0088"varchar(100) CHARACTER SET utf8 DEFAULT NULL,
"F10_0088"decimal(20,6) DEFAULT NULL,
"F11_0088"varchar(20) CHARACTER SET utf8 DEFAULT NULL,
"F12_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F13_0088"varchar(1000) CHARACTER SET utf8 DEFAULT NULL,
"F14_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F15_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F16_0088"varchar(4000) CHARACTER SET utf8 DEFAULT NULL,
"F17_0088"varchar(100) CHARACTER SET utf8 DEFAULT NULL,
"F18_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F19_0088"varchar(50) CHARACTER SET utf8 DEFAULT NULL,
"F20_0088"varchar(8) CHARACTER SET utf8 DEFAULT NULL,
"F21_0088"varchar(2000) CHARACTER SET utf8 DEFAULT NULL,
"F22_0088" varchar(10)CHARACTER SET utf8 DEFAULT NULL,
"F23_0088"varchar(10) CHARACTER SET utf8 DEFAULT NULL,
"F24_0088"varchar(200) CHARACTER SET utf8 DEFAULT NULL,
"F25_0088"decimal(9,0) DEFAULT NULL,
PRIMARY KEY("OB_OBJECT_ID"),
KEY "idx_f1_0088"("F1_0088"),
KEY "idx_f2_0088"("F2_0088"),
KEY"idx_f22_0088" ("F22_0088"),
KEY "idx_f8_0088"("F8_0088"),
KEY "idx_f9_0088"("F9_0088")
)
;
alter tabletest.tb_object_0088 discard tablespace;
use stonedbforwfc;
FLUSH TABLES tb_object_0088FOR EXPORT;
unlock tables;
cp t.cfg t.ibd /wind/data/mysqldadta/test
chmod –R 777 t.*
alter tabletest.tb_object_0088 import tablespace;