MySQL运维实战之备份和恢复(8.8)恢复单表

俊达10个月前技术文章450

xtrabackup支持单表恢复。如果一个表使用了独立表空间(innodb_file_per_table=1),就可以单独恢复这个表。



1、Prepare

prepare时带上参数--export,xtrabackup会生成import tablespace需要的文件。

# xtrabackup --prepare --export --target-dir=. > export.log 2>&1


查看日志,确认prepare成功。


查看目标数据库下的文件,这里我们希望恢复demo.last_gtid表


# ls -l demo/last_gtid.*
-rw-r--r-- 1 root root     715 6月  27 11:03 demo/last_gtid.cfg
-rw-r----- 1 root root 9437184 6月  26 16:08 demo/last_gtid.ibd


2、目标数据库上创建希望恢复的表

表结构要和备份时的表结构一致。

mysql> show create table last_gtid\G
*************************** 1. row ***************************
       Table: last_gtid
Create Table: CREATE TABLE `last_gtid` (
  `id` int NOT NULL AUTO_INCREMENT,
  `gtid` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26733 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)



我们先将表drop掉,模拟数据丢失的场景。

mysql> drop table last_gtid;
Query OK, 0 rows affected (0.03 sec)


创建结构,并执行discard tablespace命令。

mysql>  CREATE TABLE `last_gtid` (
    ->   `id` int NOT NULL AUTO_INCREMENT,
    ->   `gtid` varchar(1000) DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.06 sec)

mysql> alter table last_gtid discard tablespace;
Query OK, 0 rows affected (0.01 sec)


3、将备份的文件copy到目标实例数据库目录下

将表对应的文件copy到目标实例数据库对应目录下,并修改文件owner。如果文件owner没有正确设置,下一步import表空间时可能会出错。

# cp last_gtid.* /data/full_restore/data/demo/

# ls -l /data/full_restore/data/demo/
-rw-r--r-- 1 root  root      715 6月  27 11:06 last_gtid.cfg
-rw-r----- 1 root  root  9437184 6月  27 11:06 last_gtid.ibd

# chown -R mysql:mysql /data/full_restore/data/demo/


4、import表空间

执行import tablespace命令,确认数据恢复。

mysql> alter table demo.last_gtid import tablespace;
Query OK, 0 rows affected (0.29 sec)

mysql> select count(*) from demo.last_gtid;
+----------+
| count(*) |
+----------+
|    10813 |
+----------+
1 row in set (0.00 sec)


如果不知道表的表结构,可以使用ibd2sdi工具,从ibd文件中提取表结构信息:

# ibd2sdi last_gtid.ibd | more
["ibd2sdi"
,
{
	"type": 1,
	"id": 371,
	"object":
		{
    "mysqld_version_id": 80032,
    "dd_version": 80023,
    "sdi_version": 80019,
    "dd_object_type": "Table",
    "dd_object": {
        "name": "last_gtid",
        "mysql_version_id": 80032,
        "created": 20230621022444,
        "last_altered": 20230621022444,
        "hidden": 1,
        "options": "avg_row_length=0;encrypt_type=N;key_block_size=0;keys_disabled=0;pack_record=1;stats_a
uto_recalc=0;stats_sample_pages=0;",
        "columns": [
            {
                "name": "id",
                "type": 4,
                "is_nullable": false,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": true,
                "is_virtual": false,
                ......

                "column_key": 2,
                "column_type_utf8": "int",
                "elements": [],
                "collation_id": 255,
                "is_explicit_collation": false
            },
            {
                "name": "gtid",
                "type": 16,
                "is_nullable": true,
                "is_zerofill": false,
                "is_unsigned": false,
                "is_auto_increment": false,
                "is_virtual": false,
                "hidden": 1,
                "ordinal_position": 2,
                "char_length": 4000,
                .....
                "column_key": 1,
                "column_type_utf8": "varchar(1000)",
                "elements": [],
                "collation_id": 255,
                "is_explicit_collation": false
            },



相关文章

MySQL运维实战之备份和恢复(8.1)xtrabackup全量备份

xtrabackup是percona开源的mysql物理备份工具。xtrabackup 8.0支持mysql 8.0版本的备份和恢复。xtrabackup 2.4支持mysql 5.7及以下版本的备份...

MySQL运维实战之备份和恢复(8.7)将数据库恢复到指定时间点的另外一种方法

使用mysql原生复制功能实现时间点恢复使用mysqlbinlog解析并执行binlog是实现mysql时间点恢复的一种常用的方法。这里提供另外一种实现时间点恢复的方法:使用mysql的复制功能来实现...

MySQL运维实战之备份和恢复(8.9)xtrabackup备份指定表

备份部分表如果实例设置了参数innodb_file_per_table,xtrabackup可以备份部分表。通过--tables,--tables-file,--databases,--databas...

MySQL运维实战之备份和恢复(8.4)xtrabackup恢复全量备份

恢复全量备份恢复全量备份大致可以分成以下几步:解压备份文件、prepare备份文件、将数据copy到目标实例相关目录、启动数据库实例。解压文件如果备份时使用了xbstream,需要先解压备份文件。我们...

MySQL运维实战之备份和恢复(8.6)将数据库恢复到指定时间点

恢复到指定时间点使用全量备份和增量备份文件,都只能将数据库恢复到备份结束的时间。通过binlog,可以将数据库恢复到任意时间点(前提是备份和该时间点之间的binlog都存在)。找到时间点对应的binl...

MySQL运维实战之备份和恢复(8.5)xtrabackup恢复增量备份

恢复增量备份时,需要先对基础全量备份进行恢复,然后再依次按增量备份的时间进行恢复。这个例子中,相关备份文件的目录结构如下:/data/backup ├── full │ &nb...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。