如果没有错误,ONLINE 关键字指示数据库服务器内部提交 ALTER FRAGMENT ATTACH 工作,并在活表上放置意图互斥锁而不是互斥锁。互斥锁只能应用在未分片的死表上。
只有通过间隔分片结构分片的 surviving table 才能使用 ALTER FRAGMENT ONLINE ON TABLE 语句 ATTACH 选项。该死表必须是未分片的。
所有在活表上的索引必须具有与表相同的分片结构。(也就是说,任何索引都要连接。)出于这一原因,如果表中有主键约束或其它参考约束,那么,建议您首先为该约束创建连接索引,然后使用 ALTER TABLE 语句添加该约束。(缺省情况下,系统创建的主键约束和其它约束是拆离的。)
对于活表上的每个约束,死表上必须有相同的相符合的索引。死表上匹配的索引在 ATTACH 操作里会作为活表上的再生的索引分片。死表上的其它索引将在 ATTACH 操作中被删除。死表上的每个将会重复利用的索引必须分离于单独的 dbspace 中,并且存储该再生索引的 dbspace 必须是存储该死表的 dbspace 。
如果活表上的索引是唯一的,那么在死表上与其对应的索引也必须唯一。
最后一个要求,死表中的行在活表的区间间隔分片结构中只能跨越单个区间,这对于保护数据移动十分重要。在包含 ONLINE 关键字的 ALTER FRAGMENT ATTACH 操作中不允许数据移动。
ONLINE ATTACH 操作中只能指定一个死表。
所有其它 ATTACH 选项的限制也适用于 ONLINE ATTACH 操作。有关这些限制,请参阅 ATTACH 子句的一般限制和 ATTACH 子句的其他限制。
以下 SQL 语句定义了分片表 employee ,它使用区间间隔存储分布方案,在 emp_id 列上使用唯一索引 employee_id_idx(也是分片密钥)并在 dept_id 列上使用另一个索引 employee_dept_idx。
CREATE TABLE employee (emp_id INTEGER, name CHAR(32), dept_id CHAR(2), mgr_id INTEGER, ssn CHAR(12)) FRAGMENT BY RANGE (emp_id) INTERVAL (100) STORE IN (dbs1, dbs2, dbs3, dbs4) PARTITION p0 VALUES < 200 IN dbs1, PARTITION p1 VALUES < 400 IN dbs2; CREATE UNIQUE INDEX employee_id_idx ON employee(emp_id); CREATE INDEX employee_dept_idx ON employee(dept_id);
Fragments in surviving table before ALTER FRAGMENT ONLINE: p0 VALUES < 200 - range fragment p1 VALUES < 400 - range fragment (transition fragment) sys_p2 VALUES >= 400 AND VALUES < 500 - interval fragment sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment
下一条 SQL 语句定义了未分片表 employee2 ,它与 employee 表具有相同的列结构,并在两个与 employee 表中索引对应的列(emp_id 和 dept_id)上放置单独列索引。该语句在 emp_ssn 列上定义了唯一索引 employee2_ssn_idx 在列 name 上定义了 employee_dept_idx 索引。这四个索引都存储在 dbspace dbs4 中。CREATE TABLE 也语句指定检查约束((emp_id >=500 AND emp_id <600) ),该约束符合要连接死表的分片表达式并跨越了 employee 表结构区间间隔分片的单个分区。
CREATE TABLE employee2 (emp_id INTEGER, name CHAR(32), dept_id CHAR(2), mgr_id INTEGER, ssn CHAR(12), CHECK (emp_id >=500 AND emp_id <600)) in dbs4; CREATE UNIQUE INDEX employee2_id_idx ON employee2(emp_id) in dbs4; CREATE INDEX employee2_dept_idx ON employee2(dept_id) in dbs4; CREATE UNIQUE INDEX employee2_ssn_idx ON employee2(ssn) in dbs4; CREATE INDEX employee2_name_idx ON employee2(name) in dbs4;以下语句因为要连接的分片是区间分片(存储了分片键值低于 employee 表的事务值 400 的分片)而返回了错误。只有区间分片才能联机连接。
ALTER FRAGMENT ONLINE ON TABLE employee ATTACH employee2 AS PARTITION p3 VALUES < 300;
以下语句成功运行并创建了新的间隔分片 p3 :
ALTER FRAGMENT ONLINE ON TABLE employee ATTACH employee2 AS PARTITION p3 VALUES < 600; Fragments in surviving table after ALTER FRAGMENT ONLINE: p0 VALUES < 200 - range fragment p1 VALUES < 400 - range fragment sys_p2 VALUES >= 400 AND VALUES < 500 - interval fragment sys_p3 VALUES >= 500 AND VALUES < 600 - interval fragment sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment
注意到成功的 ALTER FRAGMENT ONLINE . . . ATTACH 操作多个必要规范符合 DDL 语句中的规范,它定义了活表和死表,包括列、索引、索引存储位置和活表的分片策略: