在 DETACH 操作中使用 ONLINE 关键字

ONLINE 关键字指示数据库服务器内部提交 ALTER FRAGMENT ... DETACH 工作,如果没有错误那么在要拆离分片的表上放置意向互斥锁而不是互斥锁。互斥锁可应用在从拆离分片创建的表上。

您只能对使用范围区间分片结构的表使用 ALTER FRAGMENT ONLINE ON TABLE 语句的 DETACH 选项。

使用范围区间存储分布方案的表具有两种类型的分片:
  • range 分片,由 CREATE TABLE 或 ALTER TABLE 语句的 FRAGMENT BY 或 PARTITION BY 子句的用户定义
  • interval 分片,如果具有超出过渡分片值上限(最后一个范围分片)的分片键值的行,那么数据库服务器在 INSERT 和 UPDATE 操作中自动生成该分片。
ONLINE DETACH 操作中只能拆离一个区间分片。

如果已拆离的区间分片不是最后一个分片,那么数据库服务器修改系统生成的遵循分片列表以匹配活表中它们的新的 sysfragments.evalpos 值的拆离分片的名称。在重命名此分片的操作中,当 sysfragments 系统目录正在用新的 partition 名称更新时,在分片上放置互斥锁(并且在 ALTER FRAGMENT DETACH 操作过程中,为在分片列表中变更初始位置的任何分片使用新 evalpos 值)。

活表上所有的索引必须与该表具有相同的分片结构。(即,任何索引必须可连接)由于这个原因,如果此表有主键约束或其它参考约束,那么建议您首先创建为该约束连接索引,然后使用 ALTER TABLE 语句添加该约束。(缺省情况下,主键约束的系统创建索引和其它已拆离的参考约束。)

如果有会话正在访问要拆离的同一分区,建议您声明 SET LOCK MODE TO WAIT 语句来获得保护非互斥存取错误足够的时间。

其它应用于 DETACH 选项的限制同样适用于 ONLINE DETACH 操作。有关这些限制,请参阅 对 ALTER FRAGMENT 语句的限制DROP 子句

ALTER FRAGMENT ONLINE ... DETACH 的示例

以下 SQL 语句定义了一个分片表 employee ,它使用范围区间存储分布方案,在列 emp_id(也是分片键)上有一个唯一索引 employee_id_idx 在列 dept_id 上有另一个索引。

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);
        
        INSERT INTO employee VALUES (401, "Susan", "DV", 101, "123-45-6789");
        INSERT INTO employee VALUES (601, "David", "QA", 104, "987-65-4321");
最后两条语句使用超出过渡分片上限的分片键值插入了行,这导致数据库服务器生成了两个新区间分片,以致于生成包含四个分片的分片列表:
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

以下语句返回了错误,因为指定的要拆离的分片是范围分片(分片存储的行的分片键值低于过渡值 400)。只有区间分片才能联机拆离。

ALTER FRAGMENT ONLINE ON TABLE employee 
        DETACH PARTITION p0 employee3;

以下语句成功运行,并创建了新表 employee3 以存储已拆离的分片中的数据。

ALTER FRAGMENT ONLINE ON TABLE employee 
        DETACH PARTITION sys_p2 employee3;
      

如果有并行的会话访问 sys_p2 ,请将锁定模式设置为 WAIT (提交的 ONLINE DETACH 操作要满足的秒数)以保护非互斥访问错误:

SET LOCK MODE TO WAIT 300;
        ALTER FRAGMENT ONLINE ON TABLE employee DETACH PARTITION sys_p2 employee3;
        
        Fragments in surviving table after ALTER FRAGMENT ONLINE:
        p0     VALUES < 200                   - range fragment
        p1     VALUES < 400                   - range fragment
        sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment.