percona Xtrabackup备份压缩\单张表备份\部分备份简述

2023年 7月 15日 63.3k 0

1、Xtrabackup的“流”及“备份压缩”功能

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如:

如:# innobackupex --stream=tar /backup | gzip > /backup/date +%F_%H-%M-%S.tar.gz

甚至也可以使用类似如下命令将数据备份至其它服务器: 如:# innobackupex --stream=tar /backup | ssh user@www.linuxea.com "cat - > /backups/date +%F_%H-%M-%S.tar"

此外,在执行本地备份时,还可以使用--parallel选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。当然,在实际进行备份时要利用此功能的便利性,也需要启用innodb_file_per_table选项或共享的表空间通过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制无法利用到此功能。其简单使用方法如下:如:# innobackupex --parallel /path/to/backup

同时,innobackupex备份的数据文件也可以存储至远程主机,这可以使用--remote-host选项来实现:如:# innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup

备份的注意1,数据和备份通常备份在单独的服务器上,可异机,异地备份,可周期完全备份。2,并且周期性恢复测试;3,在每次恢复后需要完全备份;4,针对不同规模级别的数据定制备份策略;5,数据库配置文件相关需要备份!6,二进制日志文件尽可能和数据不在一个磁盘,并且周期备份

备份恢复的步骤1,停止mysql服务器2,记录服务器的配置和文件权限3,将数据从备份移动到mysql数据目录,其知晓方式依赖于工具4,改变配置和文件权限5,以限制的访问模块重启服务器:mysqld的--skip-network选项可以跳过网络

修改my.cnf
添加` skip-networking`
如:`socket=/tmp/mysql-recovery.sock`

6,载入逻辑备份(如果有);检查和重放二进制日志7,检查意见还原的数据8,重新以完全访问的模式重启服务器

注释`my.cnf` `skip-networking` 即可

2、导入或导出单张表

默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务器就启用了innodb_file_per_table选项),并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。

(1)“导出”表导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了:如:# innobackupex --apply-log --export /path/to/backup

此命令会为每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其它服务器。

(2)“导入”表要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:如:mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然后将此表的表空间删除:如:mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”:如:mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

实例如下:1,完全备份一次

[root@mysql-master mybackups]# innobackupex -user=root /mybackups/
[root@mysql-master mybackups]# ll
total 4
drwxr-xr-x. 7 root root 4096 Jan 27 00:25 2016-01-27_00-25-53
[root@mysql-master mybackups]# 

2,导出:

[root@mysql-master mybackups]# innobackupex --apply-log --export /mybackups/2016-01-27_00-25-53/

导出后,会出现exp文件

[root@mysql-master mybackups]# ls 2016-01-27_00-25-53/hellodb/
classes.cfg  coc.cfg  courses.cfg  db.opt  Ms.ibd      scores.ibd    students.ibd  t1.ibd        teachers.ibd  toc.ibd
classes.exp  coc.exp  courses.exp  Ms.cfg  scores.cfg  students.cfg  t1.cfg        teachers.cfg  toc.cfg
classes.frm  coc.frm  courses.frm  Ms.exp  scores.exp  students.exp  t1.exp        teachers.exp  toc.exp
classes.ibd  coc.ibd  courses.ibd  Ms.frm  scores.frm  students.frm  t1.frm        teachers.frm  toc.frm
[root@mysql-master mybackups]# 

3,导入:需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:3.1为了方便查看创建表的命令,直接复制到需要导入的表中

MariaDB [hellodb]> SHOW CREATE TABLE students;

| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                    |
| students | CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 |

MariaDB [hellodb]> 


3.2创建和原表表结构一致的表

MariaDB [(none)]> create database linuxea;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use linuxea;
Database changed
MariaDB [linuxea]> CREATE TABLE `students` (
    ->   `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `Name` varchar(50) NOT NULL,
    ->   `Age` tinyint(3) unsigned NOT NULL,
    ->   `Gender` enum('F','M') NOT NULL,
    ->   `ClassID` tinyint(3) unsigned DEFAULT NULL,
    ->   `TeacherID` int(10) unsigned DEFAULT NULL,
    ->   PRIMARY KEY (`StuID`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)

MariaDB [linuxea]> 

3.3修改表,删除表空间

MariaDB [linuxea]> ALTER TABLE students DISCARD TABLESPACE;
Query OK, 0 rows affected (0.06 sec)

MariaDB [linuxea]> 

3.4复制导入的文件

[root@mysql-master mybackups]# ll 2016-01-27_00-25-53/hellodb/students.*
-rw-r--r--. 1 root root   640 Jan 27 00:27 2016-01-27_00-25-53/hellodb/students.cfg
-rw-r--r--. 1 root root 16384 Jan 27 00:27 2016-01-27_00-25-53/hellodb/students.exp
-rw-r--r--. 1 root root  8736 Jan 27 00:25 2016-01-27_00-25-53/hellodb/students.frm
-rw-r-----. 1 root root 98304 Jan 27 00:25 2016-01-27_00-25-53/hellodb/students.ibd
[root@mysql-master mybackups]# cp 2016-01-27_00-25-53/hellodb/students.ibd /mydata/data/linuxea1/
[root@mysql-master mybackups]# cp 2016-01-27_00-25-53/hellodb/students.exp /mydata/data/linuxea1/
[root@mysql-master mybackups]# cp 2016-01-27_00-25-53/hellodb/students.cfg /mydata/data/linuxea1/
[root@mysql-master mybackups]# chown -R mysql.mysql /mydata/data/linuxea1/
[root@mysql-master mybackups]# ll /mydata/data/linuxea1/
total 236
-rw-r--r--. 1 mysql mysql    65 Jan 26 01:46 db.opt
-rw-r--r--. 1 mysql mysql  8560 Jan 26 01:46 linuxea.frm
-rw-r--r--. 1 mysql mysql 98304 Jan 26 01:46 linuxea.ibd
-rw-r--r--. 1 root  root  16384 Jan 27 00:40 students.exp
-rw-rw----. 1 mysql mysql  8736 Jan 27 00:34 students.frm
-rw-r-----. 1 root  root  98304 Jan 27 00:39 students.ibd
[root@mysql-master mybackups]# 

MariaDB [linuxea]> ALTER TABLE students IMPORT TABLESPACE;

MariaDB [mydb]> ALTER TABLE students IMPORT TABLESPACE;
ERROR 1030 (HY000): Got error -1 from storage engine
MariaDB [mydb]> 

日志mysql-master-err.png错误可以借鉴这篇文章:http://imysql.cn/2008_12_17_migrate_innodb_tablespace_smoothl

3、使用Xtrabackup对数据库进行部分备份xtrabackup不适用于部分备份,更适用于完全备份的增量的备份和恢复,部分备份mysqldump更适用

Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据通过管道传输给其它程序进行处理。

此外,还原部分备份跟还原全部数据的备份也有所不同,即你不能通过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要通过导入表的方向来实现还原。当然,有些情况下,部分备份也可以直接通过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,无论如何不推荐使用这种方式。

(1)创建部分备份

创建部分备份的方式有三种:正则表达式(--include), 枚举表文件(--tables-file)和列出要备份的数据库(--databases)。

(a)使用--include使用--include时,要求为其指定要备份的表的完整名称,即形如databasename.tablename,如:如:# innobackupex --include='^linuxea[.]tb1' /path/to/backup

(b)使用--tables-file此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如:如:# echo -e 'linuxea.tb1linuxea.tb2' > /tmp/tables.txt如:# innobackupex --tables-file=/tmp/tables.txt /path/to/backup

(c)使用--databases此选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;同时,在指定某数据库时,也可以只指定其中的某张表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。如:如:# innobackupex --databases="linuxea testdb" /path/to/backup

(2)整理(preparing)部分备份prepare部分备份的过程类似于导出表的过程,要使用--export选项进行:如:# innobackupex --apply-log --export /pat/to/partial/backup

此命令执行过程中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。

(3)还原部分备份还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论