TDSQL MySQL 版虽然兼容 MySQL 协议和大量 MySQL 语法,但它并不是在单机 MySQL 外面简单加一层代理。对于 InnoDB 引擎分布式实例来说,SQL 会先经过 Proxy 解析和路由,再发送到对应的 set 执行。
这意味着很多在单机 MySQL 中习以为常的操作,在 TDSQL 中需要重新理解:
- 分表需要指定
shardkey - 分表的主键和唯一索引必须包含分表键
- 查询不带分表键可能广播到所有 set
- 分表的
INSERT必须包含分表键 UPDATE和DELETE必须带WHERE条件- 单表只存放在一个 set
- 广播表会在所有 set 保存全量数据
- 部分 SQL 需要使用透传语法
- 读写分离可以通过注释标记控制
- 用户权限、备份恢复、扩缩容和主备管理中的部分操作需要在控制台完成
下面整理了 TDSQL MySQL 版 InnoDB 引擎常用的 100 条命令,覆盖连接、基础信息、对象检查、分表设计、数据操作、事务、读写分离、会话、锁、SQL 性能、空间、索引、Sequence、透传和导入导出等场景。
TDSQL MySQL 版存在不同内核和 SQL 引擎版本,部分语法与返回字段可能不同。本文不适用于 TDSQL Boundless、TDSQL PostgreSQL,也不能直接当作普通 MySQL 8.0 命令清单使用。执行前应通过控制台确认实例类型、内核版本和 SQL 引擎版本。
文中的数据库名、表名、账号、IP、端口、set 名称和分表键均为示例。涉及删除数据、终止连接、透传写操作、表结构变更和数据导入时,应先在测试环境验证。
一、连接与基础信息
1. 使用 MySQL 客户端连接 TDSQL
bash
mysql -h 192.168.1.10 -P 3306 -u appuser -p
密码由终端交互式输入,不建议直接写在命令行中。
2. 保留注释连接 TDSQL
bash
mysql -c -h 192.168.1.10 -P 3306 -u appuser -p
-c 表示保留 SQL 注释。使用读写分离、透传 SQL 和 Proxy 管理注释时,应带上该参数,避免注释被客户端过滤。
3. 查看数据库版本
sql
SELECT VERSION();
结果反映当前兼容内核版本,但还应结合控制台确认 TDSQL 产品形态和 SQL 引擎版本。
4. 查看服务器基础信息
sql
SELECT
@@hostname AS hostname,
@@port AS port,
@@version AS version,
CONNECTION_ID() AS connection_id;
经过 Proxy 连接时,部分变量反映的是当前路由节点或平台提供的逻辑信息。
5. 查看当前数据库
sql
SELECT DATABASE();
6. 查看当前用户
sql
SELECT
USER() AS login_user,
CURRENT_USER() AS privilege_user;
TDSQL MySQL 版的账号创建和权限配置通常需要通过控制台完成,不能照搬普通 MySQL 的用户管理流程。
7. 查看当前时间
sql
SELECT
NOW() AS local_time,
UTC_TIMESTAMP() AS utc_time;
8. 查看时区
sql
SELECT
@@session.time_zone AS session_time_zone,
@@global.time_zone AS global_time_zone,
@@system_time_zone AS system_time_zone;
9. 查看字符集
sql
SELECT
@@character_set_server,
@@character_set_database,
@@character_set_connection,
@@character_set_client,
@@character_set_results;
10. 查看 SQL 模式
sql
SELECT
@@global.sql_mode,
@@session.sql_mode;
SQL 模式会影响严格校验、分组查询和日期值处理。
二、数据库与对象信息
11. 查看所有数据库
sql
SHOW DATABASES;
12. 创建数据库
sql
CREATE DATABASE appdb
DEFAULT CHARACTER SET utf8mb4;
13. 切换数据库
sql
USE appdb;
14. 查看数据库创建语句
sql
SHOW CREATE DATABASE appdb;
15. 查看数据库中的表
sql
SHOW FULL TABLES FROM appdb;
16. 查看表结构
sql
DESC appdb.orders;
17. 查看完整建表语句
sql
SHOW CREATE TABLE appdb.orders\G
这是检查 shardkey、主键、唯一索引、字符集和二级分区定义的重要入口。
18. 查看表状态
sql
SHOW TABLE STATUS FROM appdb LIKE 'orders'\G
返回的行数通常是估算值,分布式实例中的空间数据还应结合控制台监控判断。
19. 查看表字段
sql
SELECT
column_name,
column_type,
is_nullable,
column_key,
column_default,
extra
FROM information_schema.columns
WHERE table_schema = 'appdb'
AND table_name = 'orders'
ORDER BY ordinal_position;
20. 查看表约束
sql
SELECT
constraint_name,
constraint_type
FROM information_schema.table_constraints
WHERE table_schema = 'appdb'
AND table_name = 'orders'
ORDER BY constraint_type, constraint_name;
三、分表、单表与广播表
21. 创建 HASH 分表
sql
CREATE TABLE appdb.orders (
order_id BIGINT NOT NULL,
customer_id BIGINT NOT NULL,
order_time DATETIME NOT NULL,
amount DECIMAL(18,2) NOT NULL,
PRIMARY KEY (order_id, customer_id),
KEY idx_orders_customer (customer_id)
) ENGINE = InnoDB
SHARDKEY = customer_id;
SHARDKEY 必须放在建表语句末尾。分表键应选择分布较均匀、查询经常携带并且不会更新的字段。
22. 创建带唯一索引的分表
sql
CREATE TABLE appdb.user_account (
user_id BIGINT NOT NULL,
account_no VARCHAR(64) NOT NULL,
user_name VARCHAR(100),
PRIMARY KEY (user_id),
UNIQUE KEY uk_account_user (account_no, user_id)
) ENGINE = InnoDB
SHARDKEY = user_id;
分表的主键和每个唯一索引都必须包含分表键,否则无法保证跨分片全局唯一。
23. 创建普通单表
sql
CREATE TABLE appdb.system_config (
config_key VARCHAR(100) PRIMARY KEY,
config_value VARCHAR(500)
) ENGINE = InnoDB;
不指定 shardkey 时创建的是单表,数据存放在一个 set 中,适合数据量较小且不需要广播的对象。
24. 创建广播表
sql
CREATE TABLE appdb.region_dict (
region_id INT PRIMARY KEY,
region_name VARCHAR(100)
) ENGINE = InnoDB
SHARDKEY = noshardkey_allset;
广播表会在所有 set 中保存全量数据,适合较小、更新不频繁并且经常参与跨 set 关联的字典表。
25. 创建一级 RANGE 分表
sql
CREATE TABLE appdb.orders_range (
order_id BIGINT NOT NULL,
order_time DATE NOT NULL,
amount DECIMAL(18,2),
PRIMARY KEY (order_id, order_time)
)
TDSQL_DISTRIBUTED BY RANGE(order_id) (
s1 VALUES LESS THAN (1000000),
s2 VALUES LESS THAN (2000000)
);
RANGE 和 LIST 一级分区语法需要相应 SQL 引擎版本支持,MySQL 5.7 兼容内核可能不支持。
26. 创建一级 LIST 分表
sql
CREATE TABLE appdb.customer_list (
customer_id BIGINT NOT NULL,
customer_name VARCHAR(100),
PRIMARY KEY (customer_id)
)
TDSQL_DISTRIBUTED BY LIST(customer_id) (
s1 VALUES IN (1,3,5),
s2 VALUES IN (2,4,6)
);
s1、s2 是 set 别名,应根据实际 set 数量和官方规则配置,不能随意改成业务名称。
27. 创建一级 HASH、二级 RANGE 分区表
sql
CREATE TABLE appdb.order_history (
customer_id BIGINT NOT NULL,
order_id BIGINT NOT NULL,
order_date DATE NOT NULL,
amount DECIMAL(18,2),
PRIMARY KEY (customer_id, order_id, order_date)
) ENGINE = InnoDB
SHARDKEY = customer_id
PARTITION BY RANGE COLUMNS(order_date) (
PARTITION p202601 VALUES LESS THAN ('2026-02-01'),
PARTITION p202602 VALUES LESS THAN ('2026-03-01'),
PARTITION pmax VALUES LESS THAN (MAXVALUE)
);
二级分区适合需要按时间裁剪和清理的表,不建议划分过细。
28. 查看分区信息
sql
SELECT
table_schema,
table_name,
partition_name,
partition_method,
partition_expression,
table_rows
FROM information_schema.partitions
WHERE table_schema = 'appdb'
AND table_name = 'order_history'
ORDER BY partition_ordinal_position;
29. 增加二级 RANGE 分区
sql
ALTER TABLE appdb.order_history
ADD PARTITION (
PARTITION p202603 VALUES LESS THAN ('2026-04-01')
);
执行前应检查现有 MAXVALUE 分区和当前内核支持情况。
30. 删除二级分区
sql
ALTER TABLE appdb.order_history
DROP PARTITION p202601;
删除分区会同时删除其中数据,执行前必须确认数据保留策略和备份。
四、分布式 DML 与路由
31. 向分表插入数据
sql
INSERT INTO appdb.orders
(order_id, customer_id, order_time, amount)
VALUES
(10001, 2001, NOW(), 199.00);
分表的 INSERT 必须包含分表键,否则 Proxy 无法判断数据应该写入哪个 set。
32. 批量插入同一分表
sql
INSERT INTO appdb.orders
(order_id, customer_id, order_time, amount)
VALUES
(10002, 2001, NOW(), 99.00),
(10003, 2002, NOW(), 299.00);
不同分表键的数据可能被路由到不同 set,应关注分布式事务和批量大小。
33. 使用分表键查询
sql
SELECT *
FROM appdb.orders
WHERE customer_id = 2001
AND order_id = 10001;
带等值分表键时,Proxy 可以直接路由到目标 set,通常是效率最高的访问方式。
34. 查询不带分表键的数据
sql
SELECT *
FROM appdb.orders
WHERE order_time >= '2026-07-01'
ORDER BY order_time DESC
LIMIT 100;
不带分表键的查询可能下发到所有 set,再由 Proxy 聚合结果。数据量大时应重点评估扫描和网络开销。
35. 更新分表数据
sql
UPDATE appdb.orders
SET amount = 209.00
WHERE customer_id = 2001
AND order_id = 10001;
UPDATE 必须带 WHERE 条件,建议包含分表键。TDSQL 不允许直接更新 shardkey 的值。
36. 删除分表数据
sql
DELETE FROM appdb.orders
WHERE customer_id = 2001
AND order_id = 10001;
DELETE 必须带 WHERE 条件,建议包含分表键,避免广播到全部 set。
37. 使用 REPLACE 写入分表
sql
REPLACE INTO appdb.orders
(order_id, customer_id, order_time, amount)
VALUES
(10001, 2001, NOW(), 209.00);
REPLACE 同样必须包含分表键,并可能先删除冲突行再插入,应评估触发的写放大。
38. 使用 INSERT ON DUPLICATE KEY UPDATE
sql
INSERT INTO appdb.orders
(order_id, customer_id, order_time, amount)
VALUES
(10001, 2001, NOW(), 209.00)
ON DUPLICATE KEY UPDATE
amount = VALUES(amount),
order_time = VALUES(order_time);
唯一键必须符合分表规则,不能在更新部分修改分表键。
39. 分页查询时固定排序
sql
SELECT
order_id,
customer_id,
order_time,
amount
FROM appdb.orders
WHERE customer_id = 2001
ORDER BY order_time DESC, order_id DESC
LIMIT 20 OFFSET 0;
分布式查询如果排序字段不唯一,不同 set 聚合后可能出现顺序不稳定,因此应增加唯一字段作为辅助排序。
40. 使用分表键关联两张分表
sql
SELECT
o.order_id,
o.customer_id,
d.product_id,
d.quantity
FROM appdb.orders o
JOIN appdb.order_detail d
ON d.customer_id = o.customer_id
AND d.order_id = o.order_id
WHERE o.customer_id = 2001;
关联表使用相同分表键并在条件中带上该键,更有机会在单个 set 内完成计算。
五、事务与读写分离
41. 开启事务
sql
START TRANSACTION;
42. 提交事务
sql
COMMIT;
43. 回滚事务
sql
ROLLBACK;
44. 创建保存点
sql
SAVEPOINT sp_before_update;
回滚到保存点:
sql
ROLLBACK TO SAVEPOINT sp_before_update;
应先确认当前内核版本和分布式事务场景是否支持预期行为。
45. 查看自动提交状态
sql
SELECT @@session.autocommit;
46. 关闭当前会话自动提交
sql
SET SESSION autocommit = 0;
使用完后恢复:
sql
SET SESSION autocommit = 1;
长时间不提交的分布式事务会占用锁和资源。
47. 查看事务隔离级别
sql
SELECT @@session.transaction_isolation;
较老兼容版本可以查看:
sql
SELECT @@session.tx_isolation;
48. 设置当前会话事务隔离级别
sql
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
49. 将查询路由到备节点
sql
/*slave*/ SELECT *
FROM appdb.orders
WHERE customer_id = 2001
ORDER BY order_time DESC
LIMIT 20;
连接客户端时必须使用 -c 保留注释。备节点读取可能存在延迟,不适合强一致读场景。
50. 只允许查询在满足延迟条件的备节点执行
sql
/*slave:slaveonly,20*/ SELECT COUNT(*)
FROM appdb.orders
WHERE customer_id = 2001;
slaveonly 表示没有符合条件的备节点时不回退到主节点,20 表示允许的延迟阈值。具体单位和支持形式应以当前版本官方文档为准。
六、连接、会话与运行状态
51. 查看当前连接 ID
sql
SELECT CONNECTION_ID();
52. 查看会话列表
sql
SHOW FULL PROCESSLIST;
重点关注连接来源、状态、运行时间和 SQL 文本。
53. 查询 PROCESSLIST
sql
SELECT
id,
user,
host,
db,
command,
time,
state,
info
FROM information_schema.processlist
ORDER BY time DESC;
54. 查看长时间运行的 SQL
sql
SELECT
id,
user,
host,
db,
time,
state,
info
FROM information_schema.processlist
WHERE command <> 'Sleep'
AND time >= 60
ORDER BY time DESC;
55. 按用户统计连接
sql
SELECT
user,
COUNT(*) AS connections
FROM information_schema.processlist
GROUP BY user
ORDER BY connections DESC;
56. 按客户端统计连接
sql
SELECT
SUBSTRING_INDEX(host, ':', 1) AS client_host,
COUNT(*) AS connections
FROM information_schema.processlist
GROUP BY SUBSTRING_INDEX(host, ':', 1)
ORDER BY connections DESC;
57. 终止正在执行的 SQL
sql
KILL QUERY 12345;
该操作只终止当前语句,连接通常保留。
58. 终止数据库连接
sql
KILL CONNECTION 12345;
终止连接会回滚未提交事务,执行前必须核对连接 ID、用户、来源地址和业务影响。
59. 查看 Proxy 和 set 状态
sql
/*proxy*/ SHOW STATUS;
连接时应使用 mysql -c。该命令可以作为查看 set 名称和 Proxy 路由信息的入口,具体输出以实例版本为准。
60. 查看数据库状态变量
sql
SHOW GLOBAL STATUS;
筛选连接相关指标:
sql
SHOW GLOBAL STATUS LIKE 'Threads%';
在分布式实例中,指标可能来自逻辑实例、Proxy 或当前路由节点,应结合控制台实例级、分片级和节点级监控解释。
七、SQL 性能与执行计划
61. 查看 SQL 执行计划
sql
EXPLAIN
SELECT *
FROM appdb.orders
WHERE customer_id = 2001
AND order_time >= '2026-07-01';
62. 以 JSON 格式查看执行计划
sql
EXPLAIN FORMAT=JSON
SELECT *
FROM appdb.orders
WHERE customer_id = 2001;
是否支持完整 JSON 字段与当前兼容内核版本有关。
63. 查看索引
sql
SHOW INDEX FROM appdb.orders;
64. 查看索引基数
sql
SELECT
index_name,
seq_in_index,
column_name,
cardinality,
non_unique
FROM information_schema.statistics
WHERE table_schema = 'appdb'
AND table_name = 'orders'
ORDER BY index_name, seq_in_index;
cardinality 是估算值,不能代替实际数据分布分析。
65. 更新表统计信息
sql
ANALYZE TABLE appdb.orders;
分表执行时可能涉及多个 set。应在低峰期执行,并确认当前版本对分表的支持方式。
66. 查看优化器相关参数
sql
SHOW VARIABLES LIKE 'optimizer%';
67. 查看会话执行超时设置
sql
SHOW VARIABLES LIKE 'max_execution_time';
如果当前版本支持,可以在会话中设置:
sql
SET SESSION max_execution_time = 30000;
单位通常为毫秒,应以实际变量说明为准。
68. 查看临时表相关状态
sql
SHOW GLOBAL STATUS LIKE 'Created_tmp%';
TDSQL MySQL 版分布式实例不支持用户创建 TEMPORARY TABLE,这里的指标主要用于观察执行过程中产生的内部临时对象。
69. 查看排序相关状态
sql
SHOW GLOBAL STATUS LIKE 'Sort%';
70. 查看全表扫描相关状态
sql
SHOW GLOBAL STATUS LIKE 'Select_scan';
全局累计值需要结合采样时间差、QPS 和分片监控判断,单次查询结果不能直接说明当前存在性能故障。
八、事务、锁与 InnoDB 检查
71. 查看正在运行的事务
sql
SELECT
trx_id,
trx_state,
trx_started,
trx_mysql_thread_id,
trx_rows_locked,
trx_rows_modified,
trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;
视图可见性与账号权限和内核版本有关。
72. 查看长事务
sql
SELECT
trx_id,
trx_mysql_thread_id,
TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS trx_seconds,
trx_rows_locked,
trx_rows_modified,
trx_query
FROM information_schema.innodb_trx
ORDER BY trx_seconds DESC;
73. 查看 InnoDB 状态
sql
SHOW ENGINE INNODB STATUS\G
重点关注最近死锁、事务、信号量、Buffer Pool 和 I/O。通过 Proxy 执行时,输出范围可能只对应某个 set,需要结合透传或控制台诊断。
74. 查看数据锁
sql
SELECT *
FROM performance_schema.data_locks;
该表适用于支持相应 Performance Schema 结构的版本。
75. 查看锁等待关系
sql
SELECT *
FROM performance_schema.data_lock_waits;
76. 关联查询阻塞与被阻塞事务
sql
SELECT
r.trx_mysql_thread_id AS waiting_thread,
r.trx_started AS waiting_since,
b.trx_mysql_thread_id AS blocking_thread,
b.trx_started AS blocking_since,
r.trx_query AS waiting_query,
b.trx_query AS blocking_query
FROM performance_schema.data_lock_waits w
JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_engine_transaction_id
JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_engine_transaction_id;
不同内核版本的锁表字段可能不同,执行前应先 DESC performance_schema.data_lock_waits。
77. 查看最近死锁信息
sql
SHOW ENGINE INNODB STATUS\G
在输出中查找:
text
LATEST DETECTED DEADLOCK
78. 查看死锁检测参数
sql
SHOW VARIABLES LIKE 'innodb_deadlock_detect';
托管实例参数是否允许修改,应以控制台参数模板为准。
79. 查看锁等待超时
sql
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
80. 设置当前会话锁等待超时
sql
SET SESSION innodb_lock_wait_timeout = 30;
这只影响当前会话,不能代替对阻塞源和长事务的排查。
九、空间、表和索引管理
81. 查看数据库逻辑大小
sql
SELECT
table_schema,
ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2) AS size_gb
FROM information_schema.tables
WHERE table_schema NOT IN (
'information_schema',
'mysql',
'performance_schema',
'sys'
)
GROUP BY table_schema
ORDER BY size_gb DESC;
分布式环境中的逻辑统计与物理分片占用可能不同,应同时查看控制台容量监控。
82. 查看大表排行
sql
SELECT
table_schema,
table_name,
table_rows,
ROUND(data_length / 1024 / 1024, 2) AS data_mb,
ROUND(index_length / 1024 / 1024, 2) AS index_mb,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb
FROM information_schema.tables
WHERE table_schema = 'appdb'
ORDER BY data_length + index_length DESC
LIMIT 20;
table_rows 对 InnoDB 通常是估算值。
83. 查看没有主键的表
sql
SELECT
t.table_schema,
t.table_name
FROM information_schema.tables t
LEFT JOIN information_schema.table_constraints c
ON c.table_schema = t.table_schema
AND c.table_name = t.table_name
AND c.constraint_type = 'PRIMARY KEY'
WHERE t.table_schema = 'appdb'
AND t.table_type = 'BASE TABLE'
AND c.constraint_name IS NULL
ORDER BY t.table_name;
84. 查看重复索引候选
sql
SELECT
table_schema,
table_name,
index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) AS index_columns
FROM information_schema.statistics
WHERE table_schema = 'appdb'
GROUP BY table_schema, table_name, index_name
ORDER BY table_name, index_columns;
结果需要人工比较,不能仅根据字段相同就直接删除索引。
85. 创建普通索引
sql
CREATE INDEX idx_orders_time
ON appdb.orders(order_time);
对于分表,大范围不带分表键的查询即使有二级索引,也可能仍然需要访问全部 set。
86. 创建包含分表键的唯一索引
sql
CREATE UNIQUE INDEX uk_orders_no_customer
ON appdb.orders(order_no, customer_id);
所有唯一索引都必须包含 shardkey。
87. 删除索引
sql
DROP INDEX idx_orders_time
ON appdb.orders;
删除前应确认索引不是唯一约束依赖对象,并观察完整业务周期。
88. 增加字段
sql
ALTER TABLE appdb.orders
ADD COLUMN remark VARCHAR(500) NULL;
分布式大表执行 DDL 可能耗时较长,应评估锁、空间和各 set 的执行情况。
89. 修改字段
sql
ALTER TABLE appdb.orders
MODIFY COLUMN remark VARCHAR(1000) NULL;
TDSQL 不支持对分表键字段进行改名,也不能通过更新数据改变分表键值。
90. 清空表
sql
TRUNCATE TABLE appdb.stage_orders;
执行前应确认表类型、数据保留要求和当前版本支持情况。清空操作不可按普通 DELETE 方式回退。
十、Sequence、透传与导入导出
91. 创建 TDSQL Sequence
sql
CREATE TDSQL_SEQUENCE appdb.order_seq
START WITH 1
TDSQL_MINVALUE 1
TDSQL_MAXVALUE 999999999999
TDSQL_INCREMENT BY 1
TDSQL_NOCYCLE
TDSQL_CACHE 20;
Sequence 需要相应 SQL 引擎版本和权限支持,主要用于并发不高且需要全局唯一编号的场景。
92. 查看 Sequence 定义
sql
SHOW CREATE TDSQL_SEQUENCE appdb.order_seq;
93. 获取下一个 Sequence 值
sql
SELECT TDSQL_NEXTVAL(appdb.order_seq);
也可以使用当前版本支持的标准兼容形式:
sql
SELECT NEXT VALUE FOR appdb.order_seq;
94. 重设 Sequence 值
sql
SELECT TDSQL_RESETVAL(appdb.order_seq, 100000);
重设前必须确认不会与现有业务数据冲突。
95. 删除 Sequence
sql
DROP TDSQL_SEQUENCE appdb.order_seq;
96. 向指定 set 透传查询
sql
/*sets:set_1544429718_1*/ SELECT COUNT(*)
FROM appdb.orders;
实际 set 名称可以通过 /*proxy*/ SHOW STATUS 查询。连接时必须使用 mysql -c。
97. 向全部 set 透传查询
sql
/*sets:allsets*/ SELECT COUNT(*)
FROM appdb.orders;
结果通常会分别返回各 set 的执行结果,不能直接把单行结果误认为整个逻辑表总数。
98. 按分表键透传 SQL
sql
/*shardkey:2001*/ SELECT *
FROM appdb.orders
WHERE customer_id = 2001;
Proxy 会根据给定分表键把 SQL 路由到对应 set。
透传写操作风险较高。一次向多个 set 透传写入时,Proxy 不会自动提供普通分布式事务保障,可能造成数据不一致。
99. 使用 mysqldump 导出数据
bash
mysqldump -h 192.168.1.10 -P 3306 -u backup_user -p \
--single-transaction \
--set-gtid-purged=OFF \
appdb orders > /backup/orders.sql
具体参数应以腾讯云数据导出导入指南和当前内核兼容性为准。大规模备份恢复优先使用控制台提供的备份能力或官方迁移工具。
100. 使用 MySQL 客户端导入 SQL 文件
bash
mysql -h 192.168.1.10 -P 3306 -u restore_user -p \
appdb < /backup/orders.sql
从单机 MySQL 导入到 TDSQL 分布式实例前,必须先调整表结构:确定表类型,为分表增加合适的 shardkey,并确保主键和所有唯一索引包含分表键。建议先导入表结构,验证无误后再导入数据,最后校验表数量、行数、索引和业务查询结果。
结语
TDSQL MySQL 版的日常使用看起来与 MySQL 相似,但 DBA 排查问题时必须多考虑两层:Proxy 如何解析和路由 SQL,以及数据实际分布在哪些 set。
一条 SQL 在单机 MySQL 中能够使用索引,并不代表它在 TDSQL 中就一定高效。如果查询没有携带分表键,即使每个 set 内部都走索引,也可能需要广播到全部 set,再由 Proxy 完成聚合、排序和返回。
因此,TDSQL 运维和优化最重要的几个检查点是:
- 当前实例到底是哪一种 TDSQL 产品和内核版本
- 表是分表、单表还是广播表
- 分表键是否选择合理
- SQL 是否携带分表键
- 主键和唯一索引是否包含分表键
- 慢 SQL 是单个 set 内部慢,还是跨 set 广播和聚合慢
- 监控指标属于实例级、分片级还是节点级
账号权限、参数模板、备份恢复、扩缩容、主备切换和监控告警等操作,应以腾讯云控制台和对应版本官方文档为准,不能简单照搬普通 MySQL 的 Shell 管理命令。
官方资料
- TDSQL MySQL 版产品文档:https://cloud.tencent.com/document/product/557
- TDSQL MySQL 版 InnoDB 引擎开发指南:https://cloud.tencent.com/document/product/557/78716
- TDSQL MySQL 版使用限制:https://cloud.tencent.com/document/product/557/47511
- TDSQL MySQL 版建表:https://cloud.tencent.com/document/product/557/8767
- TDSQL MySQL 版透传 SQL:https://cloud.tencent.com/document/product/557/47559
- TDSQL MySQL 版读写分离:https://cloud.tencent.com/document/product/557/47560
- TDSQL MySQL 版 Sequence:https://cloud.tencent.com/document/product/557/47526