CREATE CLONE
语法说明
CLONE 操作允许在 MatrixOne 数据库中复制表或数据库的结构和数据。克隆可以在同一租户内进行,也可以跨租户进行(仅限 sys 租户操作)。跨租户克隆必须使用预先创建的 snapshot。
前提条件
在执行 CLONE 操作前,需要确保:
- 源数据库和表必须已经存在
- 目标数据库(对于表克隆)必须已经存在,或者使用 CREATE DATABASE 预先创建
- 对于跨租户克隆,必须预先创建 snapshot
- 执行用户需要具有相应的权限
连接其他租户
要连接其他租户进行操作,需要使用特定格式的连接字符串:
# 连接普通租户 acc1
mysql -h 127.0.0.1 -P 6001 -u root:acc1 -p
# 连接普通租户 acc2  
mysql -h 127.0.0.1 -P 6001 -u root:acc2 -p
# 连接 sys 租户
mysql -h 127.0.0.1 -P 6001 -u root:sys -p
语法结构
克隆表
CREATE TABLE [IF NOT EXISTS] target_db.target_table 
CLONE source_db.source_table 
[{SNAPSHOT = "snapshot_name"}] 
[TO ACCOUNT account_name]
克隆数据库
CREATE DATABASE [IF NOT EXISTS] target_db 
CLONE source_db 
[{SNAPSHOT = "snapshot_name"}] 
[TO ACCOUNT account_name]
使用说明
- 同一租户内的克隆操作可以直接执行,无需 snapshot
- 跨租户克隆只能由 sys 租户执行,且必须预先创建 snapshot
- snapshot 提供了数据的时间点视图,确保克隆操作的一致性
- 克隆操作会复制表的结构、数据和相关元数据
- 目标表或数据库必须不存在,或者使用 IF NOT EXISTS 子句
权限限制
- 系统数据库限制:
- 普通租户不能克隆系统数据库(mo_task, mo_catalog, system, mysql, system_metric, information_schema, mo_debug)
- 
所有租户(包括 sys)都不能将数据克隆到系统数据库下 
- 
集群表限制: 
- 普通租户不能克隆集群表(cluster table)
- 
只有 sys 租户可以克隆系统表 
- 
订阅数据克隆: 
- 普通租户只能克隆已订阅的数据库或表
- 跨租户克隆必须由 sys 租户执行
示例
准备工作:创建测试租户、数据库和表
-- 在 sys 租户下创建测试租户
CREATE ACCOUNT acc1 ADMIN_NAME = 'admin' IDENTIFIED BY '111';
CREATE ACCOUNT acc2 ADMIN_NAME = 'admin' IDENTIFIED BY '111';
-- 连接到 acc1 租户创建测试数据
-- mysql -h 127.0.0.1 -P 6001 -u acc1:admin -p111
CREATE DATABASE acc1_db;
USE acc1_db;
CREATE TABLE acc1_tbl (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO acc1_tbl (id, name) VALUES (1, 'Alice'), (2, 'Bob');
-- 连接到 acc2 租户创建测试数据  
-- mysql -h 127.0.0.1 -P 6001 -u acc2:admin -p111
CREATE DATABASE acc2_db;
USE acc2_db;
CREATE TABLE acc2_tbl (
    id INT PRIMARY KEY,
    email VARCHAR(100)
);
INSERT INTO acc2_tbl (id, email) VALUES (1, 'alice@example.com'), (2, 'bob@example.com');
Case 1: 同一个租户中 clone
克隆表:
-- 在同一个租户内克隆表
CREATE TABLE acc1_db.t2 CLONE acc1_db.acc1_tbl;
mysql> SELECT * FROM acc1_db.acc1_tbl;
+------+-------+---------------------+
| id   | name  | created_at          |
+------+-------+---------------------+
|    1 | Alice | 2025-09-08 16:43:30 |
|    2 | Bob   | 2025-09-08 16:43:30 |
+------+-------+---------------------+
2 rows in set (0.01 sec)
-- 使用指定 snapshot 克隆
CREATE SNAPSHOT sp FOR ACCOUNT acc1;
CREATE TABLE acc1_db.t3 CLONE acc1_db.acc1_tbl {SNAPSHOT = "sp"};
mysql>  SELECT * FROM acc1_db.t3;
+------+-------+---------------------+
| id   | name  | created_at          |
+------+-------+---------------------+
|    1 | Alice | 2025-09-08 16:43:30 |
|    2 | Bob   | 2025-09-08 16:43:30 |
+------+-------+---------------------+
2 rows in set (0.01 sec)
克隆数据库:
-- 在同一个租户内克隆数据库
CREATE DATABASE acc1_db_clone CLONE acc1_db;
mysql> USE acc1_db_clone;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES;
+-------------------------+
| Tables_in_acc1_db_clone |
+-------------------------+
| acc1_tbl                |
| t2                      |
| t3                      |
+-------------------------+
3 rows in set (0.01 sec)
-- 使用指定 snapshot 克隆数据库
mysql> CREATE DATABASE acc1_db_clone_snapshot CLONE acc1_db {SNAPSHOT = "sp"};
Query OK, 0 rows affected (0.02 sec)
mysql> use acc1_db_clone_snapshot;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES;
+----------------------------------+
| Tables_in_acc1_db_clone_snapshot |
+----------------------------------+
| acc1_tbl                         |
| t2                               |
+----------------------------------+
2 rows in set (0.01 sec)
注意:跨租户的 clone 只能由 sys 操作,且必须要先创建 snapshot
Case 2: clone 其他普通租户数据到 sys
-- 切换到 sys 租户
-- mysql -h 127.0.0.1 -P 6001 -u sys:root -p111
-- sys 为 acc1 租户创建 account 级别 snapshot
CREATE SNAPSHOT sp_acc1 FOR ACCOUNT acc1;
-- 克隆数据库到 sys
CREATE DATABASE sys_db_from_acc1 CLONE acc1_db {SNAPSHOT = "sp_acc1"};
mysql> use sys_db_from_acc1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_sys_db_from_acc1 |
+----------------------------+
| acc1_tbl                   |
| t2                         |
| t3                         |
+----------------------------+
3 rows in set (0.00 sec)
-- 克隆表到 sys
CREATE TABLE sys_db_from_acc1.acc1_tbl_clone CLONE acc1_db.acc1_tbl {SNAPSHOT = "sp_acc1"};
mysql> select * from sys_db_from_acc1.acc1_tbl_clone;
+------+-------+---------------------+
| id   | name  | created_at          |
+------+-------+---------------------+
|    1 | Alice | 2025-09-08 16:43:30 |
|    2 | Bob   | 2025-09-08 16:43:30 |
+------+-------+---------------------+
2 rows in set (0.01 sec)
Case 3: clone sys 租户的数据到其他普通租户
-- 在 sys 租户下创建测试数据
CREATE DATABASE sys_db;
USE sys_db;
CREATE TABLE sys_tbl (
    id INT PRIMARY KEY,
    data VARCHAR(100)
);
INSERT INTO sys_tbl (id, data) VALUES (1, 'Sys Data 1'), (2, 'Sys Data 2');
-- sys 为自己创建 snapshot
CREATE SNAPSHOT sp_sys FOR ACCOUNT sys;
-- 克隆数据库到普通租户 acc1
CREATE DATABASE acc1_from_sys CLONE sys_db {SNAPSHOT = "sp_sys"} TO ACCOUNT acc1;
-- 克隆表到普通租户 acc1
CREATE TABLE acc1_db.sys_tbl_clone CLONE sys_db.sys_tbl {SNAPSHOT = "sp_sys"} TO ACCOUNT acc1;
--连接 acc1
mysql> use acc1_from_sys;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------------+
| Tables_in_acc1_from_sys |
+-------------------------+
| sys_tbl                 |
+-------------------------+
1 row in set (0.00 sec)
mysql> select * from acc1_db.sys_tbl_clone;
+------+------------+
| id   | data       |
+------+------------+
|    1 | Sys Data 1 |
|    2 | Sys Data 2 |
+------+------------+
2 rows in set (0.01 sec)
Case 4: clone 普通租户数据到另一个普通租户
-- sys 为源租户 acc1 创建 snapshot
CREATE SNAPSHOT sp_acc1_for_clone FOR ACCOUNT acc1;
-- 克隆表从 acc1 到 acc2
CREATE TABLE acc2_db.acc1_tbl_clone CLONE acc1_db.acc1_tbl {SNAPSHOT = "sp_acc1_for_clone"} TO ACCOUNT acc2;
-- 克隆数据库从 acc1 到 acc2
CREATE DATABASE acc2_from_acc1 CLONE acc1_db {SNAPSHOT = "sp_acc1_for_clone"} TO ACCOUNT acc2;
--连接租户 acc2
mysql> select * from acc2_db.acc1_tbl_clone;
+------+-------+---------------------+
| id   | name  | created_at          |
+------+-------+---------------------+
|    1 | Alice | 2025-09-08 16:43:30 |
|    2 | Bob   | 2025-09-08 16:43:30 |
+------+-------+---------------------+
2 rows in set (0.00 sec)
mysql> use acc2_from_acc1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+--------------------------+
| Tables_in_acc2_from_acc1 |
+--------------------------+
| acc1_tbl                 |
| sys_tbl_clone            |
| t2                       |
| t3                       |
+--------------------------+
4 rows in set (0.01 sec)
注意事项
- 
权限要求: - 同一租户内克隆需要源对象的 SELECT 权限和目标数据库的 CREATE 权限
- 跨租户克隆只能由 sys 租户执行
- 普通租户只能克隆已订阅的非系统数据库和表
 
- 
系统对象限制: - 禁止克隆到系统数据库
- 普通租户禁止克隆系统表和集群表
 
- 
Snapshot 有效期: - Snapshot 有有效期限制,过期后无法用于克隆操作
- 建议在创建 snapshot 后尽快完成克隆操作
 
- 
资源消耗: - 克隆操作会消耗存储空间和计算资源
- 大型数据库或表的克隆可能需要较长时间
 
- 
数据一致性: - 使用 snapshot 可以确保克隆数据的时间点一致性
- 无 snapshot 的克隆反映的是当前时刻的数据状态