在 ATTACH 操作中使用 ONLINE 关键字

如果没有错误,ONLINE 关键字指示数据库服务器内部提交 ALTER FRAGMENT ATTACH 工作,并在活表上放置意图互斥锁而不是互斥锁。互斥锁只能应用在未分片的死表上。

ONLINE 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 子句的其他限制

ALTER FRAGMENT ONLINE 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_iddept_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 语句中的规范,它定义了活表和死表,包括列、索引、索引存储位置和活表的分片策略: