写点什么

Xtrabackup 的安装使用

发布于: 2020 年 05 月 17 日
Xtrabackup的安装使用

一、权限要求

1. 文件系统权限

  • READ, WRITE, EXECUTE

2. 数据库权限



LOCK TABLES

需要执行 FLUSH TABLES WITH READ LOCK and FLUSH ENGINE LOGS

REPLICATION CLIENT

获取binlog日志

PROCESS

获取SHOW ENGINE INNODB STATUS线程运行情况,为了FTWRL

SUPER

暂停和启动slave 复制线程

3. 示例

mysql> CREATE USER 'cjl'@'localhost' IDENTIFIED BY 'addcn123';
mysql> GRANT SELECT, RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

二、全量备份

1. 开始全量备份

shell> innobackupex --defaults-file=/etc/my.cnf --user=cjl --password=addcn123 --host=localhost --socket=/data/mysql.sock --parallel=10 --no-timestamp /backup/backup_full

注意:留意输出的日志‘completed OK!’,说明备份成功

--defaults-file: 指定数据库配置文件

-u, --user: 用户

-p, --password: 密码

-H, --host: 主机

-S, --socket: socket

-P, --port: 端口

--parallel:多线程拷贝.ibd文件

--no-timestamp: 不使用时间戳生成备份目录

2. apply log

shell> innobackupex --apply-log ./full_backup

注意:留意输出的日志‘completed OK!’,说明apply redo 日志成功.

3. 恢复

shell> innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/full_backup
chown -R mysql:mysql /data/
#启动数据库
shell> /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

注意

恢复的目录必须是空的才可以恢复,否则会报Original data directory /data is not empty!



4.从全备中恢复单表

4.1 Innodb

非必要

mysqlfrm工具从备份文件中查看表结构

mysqlfrm --diagnostic /backdir/tb1.frm

创建表

添加一个写锁,确保安全

lock tables tb1 write;

丢弃表空间

alter table tb1 discard tablespace;

从备份文件中拷贝ibd文件,并修改权限

cp /backdir/tb1.ibd /datadir/databases/
chown -R mysql. /datadir/databases/tb1.ibd

载入表空间

alter table tb1 import tablespace;

解锁

unlock tables;

4.2 MyISAM

关闭数据库

拷贝 /backdir/tb1.* 到 /datadir/

修改权限

启动数据库

三、增量备份

1. 开始全量备份

shell> innobackupex --defaults-file=/etc/my.cnf --user='cjl' --password='addcn123' --host=localhost --socket=/data/mysql.sock --no-timestamp /backup/backup_full

注意:留意输出的日志‘completed OK!’,说明备份成功

压缩备份

innobackupex --defaults-file=/etc/my3308.cnf --user=backup --password=123 --socket=/mysql/mysql3308/data/mysql.sock --parallel=10 --no-timestamp --stream=tar /mysql/mysql3308/backup/20190819.tar | gzip > /mysql/mysql3308/backup/20190819.tar.gz &

2. 开始增量备份

  • 第一次增备模拟新数据写入

mysql> select * from aa;
+----+----------+---------------------+
| id | c1 | create_time |
+----+----------+---------------------+
| 1 | 123456 | 2017-05-12 09:55:12 |
| 2 | 222222 | 2017-05-12 09:55:31 |
| 3 | 666666 | 2017-05-12 09:55:39 |
| 4 | 62413416 | 2017-05-12 09:55:46 |
| 5 | 62123706 | 2017-05-12 09:55:54 |
| 6 | 3706 | 2017-05-12 09:56:15 |
+----+----------+---------------------+
6 rows in set (0.01 sec)
mysql> insert into aa(c1) values(233);
Rows matched: 1 Changed: 1 Warnings: 0
mysql> insert into aa(c1) values(6789);
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update aa set c1=4444 where id=4;
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update aa set c1=555555 where id=5;
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from aa;
+----+--------+---------------------+
| id | c1 | create_time |
+----+--------+---------------------+
| 1 | 123456 | 2017-05-12 09:55:12 |
| 2 | 222222 | 2017-05-12 09:55:31 |
| 3 | 666666 | 2017-05-12 09:55:39 |
| 4 | 4444 | 2017-05-12 10:20:04 |
| 5 | 555555 | 2017-05-12 10:20:19 |
| 6 | 3706 | 2017-05-12 09:56:15 |
| 7 | 233 | 2017-05-12 10:18:07 |
| 8 | 6789 | 2017-05-12 10:18:23 |
+----+--------+---------------------+
8 rows in set (0.00 sec)
  • 2.1 第一次增量备份

shell> innobackupex --defaults-file=/etc/my.cnf --user=cjl --password=123--host=localhost --socket=/data/mysql.sock --no-timestamp --incremental /backup/backup_inc1 --incremental-basedir=/backup/backup_full

注意:留意输出的日志‘completed OK!’,说明备份成功。

--incremental:增量备份

--incremental-basedir:指定上次一备份目录,如果上一次是全备就指定全备目录,是增备就指定增备目录

  • 第二次增备模拟新数据写入

mysql> select * from aa;
+----+--------+---------------------+
| id | c1 | create_time |
+----+--------+---------------------+
| 1 | 123456 | 2017-05-12 09:55:12 |
| 2 | 222222 | 2017-05-12 09:55:31 |
| 3 | 666666 | 2017-05-12 09:55:39 |
| 4 | 4444 | 2017-05-12 10:20:04 |
| 5 | 555555 | 2017-05-12 10:20:19 |
| 6 | 3706 | 2017-05-12 09:56:15 |
| 7 | 233 | 2017-05-12 10:18:07 |
| 8 | 6789 | 2017-05-12 10:18:23 |
+----+--------+---------------------+
8 rows in set (0.01 sec)
mysql> insert into aa(c1) values(99999);
Query OK, 1 row affected (0.02 sec)
mysql> delete from aa where id=1;
Query OK, 1 row affected (0.02 sec)
mysql> update aa set c1=0000 where id=3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from aa;
+----+--------+---------------------+
| id | c1 | create_time |
+----+--------+---------------------+
| 2 | 222222 | 2017-05-12 09:55:31 |
| 3 | 0 | 2017-05-12 13:02:17 |
| 4 | 4444 | 2017-05-12 10:20:04 |
| 5 | 555555 | 2017-05-12 10:20:19 |
| 6 | 3706 | 2017-05-12 09:56:15 |
| 7 | 233 | 2017-05-12 10:18:07 |
| 8 | 6789 | 2017-05-12 10:18:23 |
| 9 | 99999 | 2017-05-12 13:01:15 |
+----+--------+---------------------+
8 rows in set (0.00 sec)
  • 2.2 第二次增量备份

shell> innobackupex --defaults-file=/etc/my.cnf --user=cjl --password=123 --host=localhost --socket=/data/mysql.sock --no-timestamp --incremental /backup/backup_inc2 --incremental-basedir=/backup/backup_inc1

注意:这里--incremental-basedir指定上一次增备目录

3. 恢复

整合完成备份和增量备份

shell> innobackupex --apply-log --redo-only /backup_full/
#--redo-only:只做redo,不做undo
shell> innobackupex --apply-log --redo-only /backup_full/ --incremental-dir=/backup/backup_inc1
#--incremental-dir:指定增量备份目录,增量备份的时间顺序不能弄错。否则所有有备份都没用了
shell> innobackupex --apply-log /backup_full/ --incremental-dir=/backup/backup_inc2
#在整合最后一次增量备份时候不要使用 --redo-only 参数
shell> innobackupex --apply-log /backup_full/
#回滚未提交的事务

注意: 一定要按照完整备份、第一次增量备份、第二次增量备份的顺序进行整合,在整合最后一次增量备份时不要使用--redo-only参数。

  • 3.1全库恢复

shell> innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/backup_full
shell> chown -R mysql:mysql /data/
#启动数据库
shell> /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
  • 3.2单表恢复

shell> innobackupex --defaults-file=/etc/my.cnf --user=cjl --password=123 --export /backup/backup_full/

MySQL中创建一模一样的表结构,并删除表空间

mysql> CREATE TABLE `test` (
-> `id` int(11) DEFAULT NULL,
-> `name` varchar(10) DEFAULT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
mysql> alter table test discard tablespace;

通过apply-log 获得一致的备份

shell> innobackupex --defaults-file=/etc/my.cnf --user=cjl --password=123 --apply-log --export /backup/backup_full/

从备份目录拷贝 .ibd 文件到datadir目录

shell> cp /backup/backup_full/cjl/test.ibd /home/mysql/mysqlData/test/
shell> chown -R mysql. /home/mysql/mysqlData/test

导入表空间

mysql> alter table test import tabkespace;

四、单表备份

1. 备份

单表备份有三种方法

  • 第一种 --databases="db1.tb1 db1.tb2 db2.tb1"

shell> innobackupex --defaults-file=/etc/my.cnf --user=cjl --password=123 --host=localhost --socket=/data/mysql.sock --databases="cjl.aa cjl.bb cjl.cc" --no-timestamps /backup/cjl
  • 第二种正则表达式

shell> innobackupex --include='^mydatabase[.]mytable' /path/to/backup
  • 第三种把要备份的表写到配置文件中

shell> echo "mydatabase.mytable" > /tmp/tables.txt
shell> innobackupex --tables-file=/tmp/tables.txt /path/to/backup

因为单表备份跟全量备份,增量备份在恢复步骤不同,恢复的时候需要表结构,我们应该还要备份表结构。

这里使用mysqldump把表结构备份出来。

shell> mysqldump --user=cjl --password=123 --host=localhost --socket=/data/mysql.sock --no-data pxs > schema.sql

2. apply log

shell> innobackupex --apply-log --export /backup/yzk1/2017-05-12_06-38-49/

3. 恢复

  1. 新建一模一样的表结构,这是我之前备份的表结构

shell> mysql --user=cjl --password=123 --host=localhost --socket=/data/mysql.sock cjl < schema.sql
  1. 对需要恢复的每一张表先discard表空间

mysql> alter table cjl.aa discard tablespace;
Query OK, 0 rows affected (0.02 sec)
  1. 拷贝.ibd和.cfg文件到datadir,并修改权限

shell>cp yzk1/2017-05-12_06-38-49/cjl/aa.ibd /data/cjl/
shell>cp yzk1/2017-05-12_06-38-49/cjl/aa.cfg /data/cjl/
shell>chown -R mysql:mysql /data/cjl/aa.*
  1. import 表空间

mysql> alter table cjl.aa import tablespace;

其他的表恢复步骤同上

五、安装

yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install percona-xtrabackup-24 -y

六、参数

innobackupex参数:

--defaults-file=[MY.CNF] 该选项传递给xtrabackup子进程,从指定文件读取缺省选项
--apply-log 从备份恢复。
--redo-only 该选项强制跳过rollback阶段,只进行redo。这是有必要使用的,如果备份后,要使用增量改变的。
--copy-back 从备份目录拷贝数据和索引文件到datadir目录
--remote-host=HOSTNAME 备份到远程主机上,使用ssh
--stream=[tar|cpio(not implemented)] 指定备份标准输出格式
--tmpdir=DIRECTORY 默认与tmpdir相同。使用—remote-host或—stream参数后,传输日志文件将存放在临时目录下
--use-memory=MB 选项传递给xtrabackup子进程。恢复使用内存大小
--parallel=NUMBER-OF-THREADS 选项传递给xtrabackup子进程,指定数据传输线程总数。默认为1
--throttle=IOS 选项传递给xtrabackup子进程,限制IO线程数量
--sleep=MS 选项传递给xtrabackup子进程。每拷贝1MB数据暂停多少MS时间
--compress[=LEVEL] 选项传递给xtrabackup子进程。压缩级别在0-9.1快速压缩,9最佳压缩,0不压缩。默认为1.
--include=REGEXP 指定要备份的表的完整名称。使用正则进行匹配
--databases=LIST 指定备份数据库
--tables-file=FILE
--uncompress选项传递给xtrabackup子进程。对压缩过的InnoDB数据文件不进行压缩
--export 仅使用于prepare选项。选项传递给xtrabackup子进程。
--user=NAME
--password=WORD
--host=HOST
--port=PORT
--slave-info 备份复制从服务端,主从信息记录在ibbackup_slave_info文件中
--socket=SOCKET
--no-timestamp 不在备份根目录下创建以当前时间戳为名称的新的备份目录
--ibbackup=IBBACKUP-BINARY ibbackup二进制路径
--no-lock 禁止表级锁。全部是InnoDB引擎表和不关系二进制日志位置下使用
--scpopt=SCP-OPTIONS 指定scp参数



发布于: 2020 年 05 月 17 日阅读数: 55
用户头像

现在是你们的,未来是我们的 2020.01.11 加入

爱生活,爱DB

评论

发布
暂无评论
Xtrabackup的安装使用