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