INSERT INTO table_name [partition_info] [WITH LABEL label] [col_list] [query_stmt] [VALUES];
INSERT INTO tbl2 WITH LABEL label1 SELECT * FROM tbl3;INSERT INTO tbl1 VALUES ("qweasdzxcqweasdzxc"), ("a");
CTE(Common Table Expressions) 作为 insert 操作中的查询部分时,必须指定 WITH LABEL 和 column list 部分。INSERT INTO tbl1 WITH LABEL label1WITH cte1 AS (SELECT * FROM tbl1), cte2 AS (SELECT * FROM tbl2)SELECT k1 FROM cte1 JOIN cte2 WHERE cte1.k1 = 1;INSERT INTO tbl1 (k1)WITH cte1 AS (SELECT * FROM tbl1), cte2 AS (SELECT * FROM tbl2)SELECT k1 FROM cte1 JOIN cte2 WHERE cte1.k1 = 1;
mysql> insert into tbl1 select * from empty_tbl;Query OK, 0 rows affected (0.02 sec)
Query OK 表示执行成功。0 rows affected 表示没有数据被导入。mysql> insert into tbl1 select * from tbl2;Query OK, 4 rows affected (0.38 sec){'label':'insert_8510c568-9eda-4173-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}mysql> insert into tbl1 with label my_label1 select * from tbl2;Query OK, 4 rows affected (0.38 sec){'label':'my_label1', 'status':'visible', 'txnId':'4005'}mysql> insert into tbl1 select * from tbl2;Query OK, 2 rows affected, 2 warnings (0.31 sec){'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}mysql> insert into tbl1 select * from tbl2;Query OK, 2 rows affected, 2 warnings (0.31 sec){'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'committed', 'txnId':'4005'}
Query OK 表示执行成功。4 rows affected 表示总共有4行数据被导入。2 warnings 表示被过滤的行数。
同时会返回一个 json 串:{'label':'my_label1', 'status':'visible', 'txnId':'4005'}{'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'committed', 'txnId':'4005'}{'label':'my_label1', 'status':'visible', 'txnId':'4005', 'err':'some other error'}
label 为用户指定的 label 或自动生成的 label。Label 是该 Insert Into 导入作业的标识。每个导入作业,都有一个在单 database 内部唯一的 Label。
status 表示导入数据是否可见。如果可见,显示 visible,如果不可见,显示 committed。
txnId 为这个 insert 对应的导入事务的 id。
err 字段会显示一些其他非预期错误。
当需要查看被过滤的行时,用户可以通过如下语句:show load where label="xxx";
show transaction where id=4005;
TransactionStatus 列若为 visible,则表述数据可见。mysql> insert into tbl1 select * from tbl2 where k1 = "a";ERROR 1064 (HY000): all partitions have no load data. url: http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2
ERROR 1064 (HY000): all partitions have no load data 显示失败原因。后面的 url 可以用于查询错误的数据,具体见后面 查看错误行 小结。ERROR 1064 (HY000) ,则表示导入失败。Query OK,则表示执行成功。rows affected 为 0,表示结果集为空,没有数据被导入。rows affected 大于 0:status 为 committed,表示数据还不可见。需要通过 show transaction 语句查看状态直到 visible。status 为 visible,表示数据导入成功。warnings 大于 0,表示有数据被过滤,可以通过 show load 语句获取 url 查看被过滤的行。SHOW LAST INSERT 命令来显式的获取最近一次 insert 操作的结果。
当执行完一个 insert 操作后,可以在同一 session 连接中执行 SHOW LAST INSERT。该命令会返回最近一次insert 操作的结果,如:mysql> show last insert\\G*************************** 1. row ***************************TransactionId: 64067Label: insert_ba8f33aea9544866-8ed77e2844d0cc9bDatabase: default_cluster:db1Table: t1TransactionStatus: VISIBLELoadedRows: 2FilteredRows: 0
show last insert 命令来获取 insert 的结果。insert_load_default_timeout_second。
同时 Insert Into 语句收到 Session 变量 query_timeout 的限制。可以通过 SET query_timeout = xxx; 来增加超时时间,单位是秒。enable_insert_strict 这个 Session 参数用来控制。SET enable_insert_strict = true; 来设置。query_timeout 的限制。可以通过 SET query_timeout = xxx; 来增加超时时间,单位是秒。导入数据量 = 36G 约≤ 3600s * 10M/s其中 10M/s 是最大导入限速,用户需要根据当前集群情况计算出平均的导入速度来替换公式中的 10M/s
store_sales schema:(id, total, user_id, sale_timestamp, region)bj_store_sales schema:(id, total, user_id, sale_timestamp)
计算导入的大概时间10G / 5M/s = 2000s修改 FE 配置insert_load_default_timeout_second = 2000
INSERT INTO bj_store_sales WITH LABEL `label` SELECT id, total, user_id, sale_timestamp FROM store_sales where region = "bj";
enable_insert_strict 设置为完全容忍错误数据或完全忽略错误数据。因此如果 enable_insert_strict 设为 true,则 Insert Into 可能会失败。而如果 enable_insert_strict 设为 false,则可能出现仅导入了部分合格数据的情况。
当返回结果中提供了 url 字段时,可以通过以下命令查看错误行:SHOW LOAD WARNINGS ON "url";
示例:SHOW LOAD WARNINGS ON "http://ip:port/api/_load_error_log?file=__shard_13/error_log_insert_stmt_d2cac0a0a16d482d-9041c949a4b71605_d2cac0a0a16d482d_9041c949a4b71605";
文档反馈