达梦数据库的几种模式及状态说明
DM 支持 3 种数据库模式: Normal 模式、 Primary 模式和 Standby 模式。
DM数据库的状态包括startup、mount、after redo、open、suspend、shutdown这几种状态,但不是所有的状态都能相互转换和人工干预。
DM的三种模式
DM 支持 3 种数据库模式: Normal 模式、 Primary 模式和 Standby 模式。
Normal 模式
用户可以正常访问数据库,操作没有限制。正常生成本地归档,但不发送实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。
将数据库切换为 Normal 模式:
ALTER DATABASE NORMAL;
Primary 模式
用户可以正常访问数据库,操作有极少限制。对临时表空间以外的所有的数据库对象的修改操作都强制生成 Redo 日志。正常生成本地归档,支持实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。 在归档有效时,发送 REDO 日志到备库;
该模式下部分功能受限,包括:不支持修改表空间文件名、不支持修改 arch_ini 参数。正常生成本地归档,支持实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。
将数据库切换为Primary模式:
ALTER DATABASE PRIMARY;
Standby 模式
可以执行数据库备份(不能执行数据库作业备份)、查询等只读数据库操作。接收主库发送过来的REDO 日志并重做。正常生成本地归档,正常发送异步归档日志;但实时归档(Realtime)、即时归档(Timely)均强制失效。该模式下时间触发器、事件触发器等都失效。
另外,还支持临时表的 Insert/Delete/Update 操作。因为临时表数据的修改不会产生 Redo 日志,所以同样主库对临时表的修改无法同步到备库。
将数据库切换为 Standby 模式:
ALTER DATABASE STANDBY;
需要注意的是:
1、三种模式只能在 MOUNT 状态下设置,模式之间可以相互转换。
2、对于新初始化的库,首次启动不允许使用 mount 方式,需要先正常启动并正常退出,然后才允许 mount 方式启动。
3、一般情况下,数据库为 NORMAL 模式,如果不指定 MOUNT 状态启动,则自动启动到 OPEN状态。
4、在需要对数据库配置时(如配置数据守护、数据复制),服务器需要指定 MOUNT 状态启动。
5、当数据库模式为非 NORMAL 模式(PRIMARY、 STANDBY 模式),无论是否指定启动状态,服务器启动时自动启动到 MOUNT 状态。
6、修改 DMDSC 库的模式必须在 DMDSC 库所有实例都处于 MOUNT 状态下才能进行,只需要在一个节点上执行以上语句即可
DM数据库的状态
DM数据库的状态包括startup、mount、after redo、open、suspend、shutdown这几种状态。
Startup 状态
系统刚启动时设置为 Startup 状态。
Mount 状态
数据库在 Mount 状态下,不能修改数据,不能访问表、视图等数据库对象,但可以执行修改归档配置、控制文件和修改数据库模式等操作,也可以执行一些不修改数据库内容的操作,比如查询动态视图或者一些只读的系统过程。
由于 Mount 状态不生成 PWR 日志,因此数据页可以正常刷盘,也正常推进检查点。系统从 Open 状态切换为 Mount 状态时, 会强制回滚所有活动事务,但不会强制清理(Purge)已提交事务,不会强制断开用户连接,也不会强制 Buffer 中的脏页刷盘。
将数据库修改为mount状态:
ALTER DATABASE MOUNT;
示例:
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 5.273(毫秒)
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
已用时间: 0.407(毫秒). 执行号:5.
SQL> alter database mount;
操作已执行
已用时间: 00:00:01.778. 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 MOUNT
PWR日志: Page Written Record 日志,是REDO 日志里包含有一种特殊的记录。包括(ts_id, fil_id, page_no, page_lsn)信息。每个数据页刷盘时,都会生成一条对应的 PWR 日志。
After Redo 状态
系统启动过程中联机日志重做完成后,回滚活动事务前设置为 After Redo 状态。非Standby 模式的实例在执行 alter database open 操作前,也会将系统设置为 After Redo 状态。
Open 状态
可以访问数据库对象,对外提供正常的数据库服务,不能进行控制文件维护、归档配置等操作。
将数据库修改为 Open 状态: (当系统处于 Primary/Standby 模式时,必须强制加上 FORCE 子句。)
ALTER DATABASE OPEN [FORCE];
示例:
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 MOUNT
已用时间: 54.783(毫秒). 执行号:4.
SQL> alter database open;
操作已执行
已用时间: 00:00:09.971. 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
已用时间: 0.407(毫秒). 执行号:5.
Suspend 状态
数据库在 Suspend 状态下,可以访问数据库对象,甚至可以修改数据,但限制 Redo 日志刷盘, 一旦执行 COMMIT 等触发 Redo 日志刷盘的操作时,当前操作将被挂起。
相比 Open 到 Mount 的状态切换, Open 到 Suspend 的状态切换更加简单、高效,不会回滚任何活动事务,在状态切换完成后,所有事务可以继续执行。
在DataWatch主备系统中suspend状态的自动切换的使用:
一般在修改归档状态之前将系统切换为 Suspend 状态,比如备库故障恢复后,在历史数据(归档日志)同步完成后,需要重新启用实时归档功能时:
- 将系统切换为 Suspend 状态,限制 Redo 日志写入联机 Redo 日志文件;
- 修改归档状态为 Valid;
- 重新将数据库切换为 Open 状态,恢复 Redo 日志写入功能;
- 备库与主库重新进入实时同步状态。
实时归档失败时(比如网络故障导致), Primary 实例将试图切换成 Suspend状态,防止后续的日志写入。因为一旦写入,主备切换时有可能备库没有收到最后那次的RLOG_PKG,导致主库上多一段日志,很容易造成主备数据不一致。当实例成功切换为SUSPEND 状态时,可直接退出,强制丢弃多余的日志,避免主备数据不一致。
将数据库修改为 Suspend 状态:
ALTER DATABASE SUSPEND;
注意:修改 DMDSC 库的状态为 SUSPEND 时,库内所有实例都不能处于 MOUNT 状态,只需要在一个节点上执行 ALTER DATABASE SUSPEND 语句即可。
示例:
Session 1:
SQL> alter database suspend;
操作已执行
已用时间: 100.968(毫秒). 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 SUSPEND
Session 2:
SQL> select count(*) from test; ---查询正常
行号 COUNT(*)
---------- --------------------
1 3
已用时间: 2.639(毫秒). 执行号:8.
SQL> insert into test values(1,'a',10000); ---插入正常
影响行数 1
已用时间: 0.882(毫秒). 执行号:11.
SQL> commit; ---但是提交会挂起
Session 3:
SQL> create table t(id int); ---设计会一直挂起
Session 1:
修改为open状态:
SQL> alter database open;
操作已执行
已用时间: 0.644(毫秒). 执行号:0.
Session 2: 创建成功
SQL> create table t(id int);
操作已执行
已用时间: 00:05:41.432. 执行号:7.
Session 3: 提交成功
SQL> insert into test values(1,'a',10000);
影响行数 1
已用时间: 0.882(毫秒). 执行号:11.
SQL> commit;
操作已执行
已用时间: 00:01:44.580. 执行号:12.
SQL>
Shutdown 状态
实例正常退出时设置为 Shutdown 状态。
数据库状态之间的切换
- Open 状态与 Mount 状态可以相互切换;
- Open 状态与 Suspend 状态可以相互切换;
- Mount 和 Suspend 状态不能直接转换;
- 其他状态为系统内部状态,用户不能主动干预。
另外, 可以通过参数ALTER_MODE_STATUS来控制是否允许手工修改服务器的模式、 状态和OGUID,1: 允许; 0: 不允许。默认为1。此参数可以动态修改。
示例:
1、Open状态与Mount状态的相互切换
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
已用时间: 0.287(毫秒). 执行号:13.
SQL> alter database mount;
操作已执行
已用时间: 00:00:01.760. 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 MOUNT
已用时间: 0.677(毫秒). 执行号:14.
SQL> alter database open;
操作已执行
已用时间: 00:00:01.741. 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
已用时间: 0.280(毫秒). 执行号:15.
2、Open状态与Suspend状态的相互切换
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
已用时间: 0.280(毫秒). 执行号:15.
SQL> alter database suspend;
操作已执行
已用时间: 100.965(毫秒). 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 SUSPEND
已用时间: 0.700(毫秒). 执行号:16.
SQL> alter database open;
操作已执行
已用时间: 0.517(毫秒). 执行号:0.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
已用时间: 0.291(毫秒). 执行号:17.
3、Mount状态与Suspend状态不能直接切换
mount状态切换suspend状态:
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 MOUNT
已用时间: 0.673(毫秒). 执行号:18.
SQL> alter database suspend;
alter database suspend;
第1 行附近出现错误[-510]:系统处于MOUNT状态.
已用时间: 0.523(毫秒). 执行号:0.
suspend状态切换mount状态:
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 SUSPEND
已用时间: 0.665(毫秒). 执行号:19.
SQL> alter database mount;
alter database mount;
第1 行附近出现错误[-515]:系统处于SUSPEND状态.
已用时间: 0.337(毫秒). 执行号:0.
SQL>
上一篇: 【转】sql语句优化原则