RESTORE … FROM SNAPSHOT

RESTORE … SNAPSHOT 用于从之前创建的集群/租户/数据库/表级别的快照中进行集群/租户/数据库/表级别的恢复数据。

语法说明

RESTORE ... SNAPSHOT 用于从之前创建的集群/租户/数据库/表级别的快照中进行集群/租户/数据库/表级别的恢复数据。

语法结构

RESTORE CLUSTER {SNAPSHOT = <snapshot_name>};

RESTORE ACCOUNT <account_name> {SNAPSHOT = <snapshot_name>} [TO ACCOUNT <target_account_name>];

RESTORE DATABASE [<account_name>.]<database_name> {SNAPSHOT = <snapshot_name>} [TO ACCOUNT <target_account_name>];

RESTORE TABLE [<account_name>.]<database_name>.<table_name> {SNAPSHOT = <snapshot_name>} [TO ACCOUNT <target_account_name>];
  • RESTORE DATABASERESTORE TABLE 在省略 <account_name>. 时默认作用于当前租户,如需恢复其他租户对象请使用带租户前缀的点分格式。

  • 快照子句同样支持兼容写法 FROM SNAPSHOT <snapshot_name>{SNAPSHOT = "<snapshot_name>"}

示例

示例 1:恢复集群

--在租户 acc1,acc2 下执行
create database db1;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
create snapshot cluster_sp1 for cluster;--为集群创建快照

--在租户 acc1,acc2 下执行
drop database db1;--删除数据库 db1

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
restore cluster{snapshot="cluster_sp1"};--在系统租户下对集群进行快照恢复

--在租户 acc1,acc2 下执行
mysql> show databases;--恢复成功
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

示例 2:恢复租户

--在租户 acc1 下执行
CREATE database db1;
CREATE database db2;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
7 rows in set (0.00 sec)

create snapshot acc1_snap1 for account acc1;--创建快照
drop database db1;--删除数据库 db1,db2
drop database db2;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
5 rows in set (0.01 sec)

restore account acc1 {snapshot = acc1_snap1};--恢复租户级别快照

mysql> show databases;--恢复成功
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
7 rows in set (0.01 sec)

示例 3:恢复数据库

--在租户 acc1 下执行
CREATE database db1;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
7 rows in set (0.00 sec)

create snapshot acc1_db_snap1 for account acc1;--创建快照
drop database db1;--删除数据库 db1

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
restore database acc1.db1 {snapshot = acc1_db_snap1};--恢复数据库级别快照

mysql> show databases;--恢复成功
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
7 rows in set (0.00 sec)

示例 4:恢复表

--在租户 acc1 下执行
CREATE TABLE t1(n1 int);
INSERT INTO t1 values(1);

mysql> SELECT * FROM t1;
+------+
| n1   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

create snapshot acc1_tab_snap1 for account acc1;--创建快照
truncate TABLE t1;--清空 t1

mysql> SELECT * FROM t1;
Empty set (0.01 sec)

--在系统租户 sys 下执行
restore TABLE acc1.db1.t1 {snapshot = acc1_tab_snap1};--恢复快照

mysql> SELECT * FROM t1;--恢复成功
+------+
| n1   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

示例 5:系统租户恢复普通租户到普通租户本租户

--在租户 acc1 下执行
create database db1;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
create snapshot acc1_snap1 for account acc1;--为 acc1 创建快照

--在租户 acc1 下执行
drop database db1;--删除数据库 db1

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
restore account acc1 {snapshot = acc1_snap1} TO account acc1;--在系统租户下对 acc1 进行快照恢复

--在租户 acc1 下执行
mysql> show databases;--恢复成功
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

示例 6:系统租户恢复普通租户到新租户

--在租户 acc1 下执行
create database db1;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
create snapshot acc1_snap1 for account acc1;--为 acc1 创建快照

--在租户 acc1 下执行
drop database db1;--删除 db1

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

--在系统租户 sys 下执行
create account acc2 ADMIN_NAME admin IDENTIFIED BY '111';--需要提前创建要目标新租户
restore account acc1 {snapshot = acc1_snap1} TO account acc2;--在系统租户下对 acc1 进行快照恢复,恢复至 acc2

--在租户 acc1 下执行
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
5 rows in set (0.00 sec)

--在租户 acc2 下执行
mysql> show databases;--恢复至 acc2
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mo_catalog         |
| mysql              |
| system             |
| system_metrics     |
+--------------------+
6 rows in set (0.01 sec)

示例 7:恢复包含 Hive 分区外部表的快照

快照恢复支持包含 Hive 分区外部表的数据库。从快照恢复数据库或表时,Hive 分区外部表会与普通表一起正确恢复。

DROP SNAPSHOT IF EXISTS sp_24559;
DROP DATABASE IF EXISTS restore_hive_24559;

CREATE DATABASE restore_hive_24559;
USE restore_hive_24559;

CREATE TABLE base_t (id INT PRIMARY KEY);
INSERT INTO base_t VALUES (1), (2);

CREATE EXTERNAL TABLE hive_ext (
    id INT,
    amount DOUBLE,
    year INT
) INFILE{
    'filepath'='$resources/hive_partition/single_level/',
    'format'='parquet',
    'hive_partitioning'='true',
    'hive_partition_columns'='year'
};

CREATE SNAPSHOT sp_24559 FOR ACCOUNT;
INSERT INTO base_t VALUES (3);

RESTORE TABLE restore_hive_24559.hive_ext{SNAPSHOT="sp_24559"};
RESTORE DATABASE restore_hive_24559{SNAPSHOT="sp_24559"};

SHOW FULL TABLES FROM restore_hive_24559;

DROP SNAPSHOT IF EXISTS sp_24559;
DROP DATABASE IF EXISTS restore_hive_24559;

示例 8:快照恢复中的用户锁定状态

快照创建和恢复会保留用户锁定状态(ALTER USER ... LOCK / UNLOCK)。当创建账户快照并随后恢复时,被锁定的用户保持锁定状态,未被锁定的用户保持解锁状态,与快照创建时的状态一致。

DROP SNAPSHOT IF EXISTS issue21685_user_lock_acc_sp;
DROP ACCOUNT IF EXISTS issue21685_restore_acc;

CREATE ACCOUNT issue21685_restore_acc ADMIN_NAME = 'admin' IDENTIFIED BY '111';
-- @session:id=1&user=issue21685_restore_acc:admin&password=111
CREATE USER issue21685_restore_user IDENTIFIED BY '111';
ALTER USER issue21685_restore_user LOCK;
-- @session

CREATE SNAPSHOT issue21685_user_lock_acc_sp FOR ACCOUNT issue21685_restore_acc;
-- @session:id=1&user=issue21685_restore_acc:admin&password=111
ALTER USER issue21685_restore_user UNLOCK;
-- @session

RESTORE ACCOUNT issue21685_restore_acc {SNAPSHOT = "issue21685_user_lock_acc_sp"};
-- 恢复后,用户重新被锁定(快照时的状态)

DROP ACCOUNT IF EXISTS issue21685_restore_acc;
DROP SNAPSHOT IF EXISTS issue21685_user_lock_acc_sp;

限制

  • 系统租户恢复普通租户到新租户只允许租户级别的恢复。

  • 只有系统租户才可以执行恢复数据到新租户,且只允许租户级别的恢复。新租户需提前创建,为了避免对象冲突,新租户最好为新建租户。