数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复

上篇文章(转战MySQL Shell!数据库备份新姿势 , 轻松搞定备份操作?。┘虻ソ樯芰耸褂肕ySQL Shell进行数据库备份 , 本文基于上文的备份进行数据恢复演示操作 。
一、恢复单表因为上次备份的表是testdb1.test1表,如果恢复到当前库,则可以先删除该库中的表,再恢复 。
1、先删除库里的表# mysqlsh -u root-p -S /data/mysql/mysql3306/tmp/mysql.sockPlease provide the password for 'root@/data%2Fmysql%2Fmysql3306%2Ftmp%2Fmysql.sock': *********Save password for 'root@/data%2Fmysql%2Fmysql3306%2Ftmp%2Fmysql.sock'? [Y]es/[N]o/Ne[v]er (default No): MySQL Shell 8.0.35Copyright (c) 2016, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its affiliates.Other names may be trademarks of their respective owners.Type 'help' or '?' for help; 'quit' to exit.Creating a session to 'root@/data%2Fmysql%2Fmysql3306%2Ftmp%2Fmysql.sock'Fetching schema names for auto-completion... Press ^C to stop.Your MySQL connection id is 83Server version: 8.0.33-25 Percona Server (GPL), Release 25, Revision 60c9e2c5No default schema selected; type use <schema> to set one. MySQLlocalhostJS > sqlSwitching to SQL mode... Commands end with ;Fetching global names for auto-completion... Press ^C to stop. MySQLlocalhostSQL > use testdb1;Default schema set to `testdb1`.Fetching global names, object names from `testdb1` for auto-completion... Press ^C to stop. MySQLlocalhosttestdb1SQL > show tables;+-------------------+| Tables_in_testdb1 |+-------------------+| test1|+-------------------+1 row in set (0.0010 sec) MySQLlocalhosttestdb1SQL > drop table test1;Query OK, 0 rows affected (0.0518 sec) MySQLlocalhosttestdb1SQL >

数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复

文章插图
2、修改参数进行数据恢复时local_infile参数需要修改为on , 因此需先调整参数,否则将会报错,例如:
MySQLlocalhosttestdb1SQL > jsSwitching to JAVAScript mode... MySQLlocalhosttestdb1JS > util.loadDump('/data/backup/backup_tables');ERROR: The 'local_infile' global system variable must be set to ON in the target server, after the server is verified to be tRusted.Util.loadDump: local_infile disabled in server (MYSQLSH 53025) MySQLlocalhosttestdb1JS > sqlSwitching to SQL mode... Commands end with ; MySQLlocalhosttestdb1SQL > set global local_infile=on;Query OK, 0 rows affected (0.0002 sec)
数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复

文章插图
3、进行单表恢复上面已经删除了原库里的表,现在通过备份进行恢复 。
MySQLlocalhosttestdb1SQL > jsSwitching to JavaScript mode... MySQLlocalhosttestdb1JS >util.loadDump('/data/backup/backup_tables');Loading DDL and Data from '/data/backup/backup_tables' using 4 threads.Opening dump...Target is MySQL 8.0.33-25. Dump was produced from MySQL 8.0.33-25Scanning metadata - doneChecking for pre-existing objects...Executing common preamble SQLExecuting DDL - doneExecuting view DDL - doneStarting data loadExecuting common postamble SQL100% (157 bytes / 157 bytes), 0.00 B/s, 1 / 1 tables doneRecreating indexes - done1 chunks (8 rows, 157 bytes) for 1 tables in 1 schemas were loaded in 0 sec (avg throughput 157.00 B/s)0 warnings were reported during the load.MySQLlocalhosttestdb1JS >
数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复

文章插图
查看恢复结果:表及数据已恢复 。
数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复

文章插图
恢复过程中,对应的备份路径下会生成一个load-progress.*.json文件,该文件记录了恢复进度及结果,以便于断点续处理,文件存储的具体内容如下:
数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复

文章插图
注:如果需多次进行相同操作时,注意修改改文件内容或删除该文件,或者自定义一个文件,例如:
util.loadDump("PrefixPARURL", progressFile: "progress.json"})4、恢复至其他库很多实际情况下的数据恢复是为了将备份中的一部分数据恢复至目标表,或进行数据对比 , 因此不能将已存在的表删除 。那么建议创建一个临时恢复用的库或在其他实例上创建新库进行恢复 。那么,恢复至其他库(库名不一样),该如何操作呢?具体操作如下:
先创建一个空库:
MySQLlocalhosttestdb1SQL > create database rec;Query OK, 1 row affected (0.0220 sec) MySQLlocalhosttestdb1SQL > use rec;Default schema set to `rec`.Fetching global names, object names from `rec` for auto-completion... Press ^C to stop. MySQLlocalhostrecSQL > show tables;Empty set (0.0011 sec) MySQLlocalhostrecSQL >


推荐阅读