暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【干货攻略】达梦数据库的几种模式及状态说明

达梦E学 2022-03-25
4547

-----正文-----


本期干货介绍达梦数据库的几种模式及状态。


一、达梦数据库三种模式


达梦数据库支持 3 种数据库模式: Normal 模式、 Primary 模式和 Standby 模

1.1 Normal 模式

  • 用户可以正常访问数据库,操作没有限制。

  • 正常生成本地归档,但不发送实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。

将数据库切换为 Normal 模式:

    ALTER DATABASE NORMAL;

    1.2 Primary 模式

    • 用户可以正常访问数据库,操作有极少限制。

    • 对临时表空间以外的所有的数据库对象的修改操作都强制生成Redo日志。

    • 正常生成本地归档,支持实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。在归档有效时,发送REDO日志到备库;

    • 该模式下部分功能受限,包括:不支持修改表空间文件名、不支持修改arch_ini参数。正常生成本地归档,支持实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。

    将数据库切换为Primary模式:

      ALTER DATABASE PRIMARY;

      1.3 Standby 模式

      • 可以执行数据库备份(不能执行数据库作业备份)、查询等只读数据库操作。

      • 接收主库发送过来的REDO日志并重做。

      • 正常生成本地归档,正常发送异步归档日志;但实时归档(Realtime)、即时归档(Timely)均强制失效。

      • 该模式下时间触发器、事件触发器等都失效。

      • 另外,还支持临时表的Insert/Delete/Update操作。因为临时表数据的修改不会产生Redo日志,所以同样主库对临时表的修改无法同步到备库。

      将数据库切换为 Standby 模式:

        ALTER DATABASE STANDBY;

         需要注意的是:

        • 三种模式只能在MOUNT状态下设置,模式之间可以相互转换。

        • 对于新初始化的库,首次启动不允许使用mount方式,需要先正常启动并正常退出,然后才允许mount方式启动。

        • 一般情况下,数据库为NORMAL模式,如果不指定MOUNT状态启动,则自动启动到OPEN状态。

        • 在需要对数据库配置时(如配置数据守护、数据复制),服务器需要指定MOUNT状态启动。

        • 当数据库模式为非NORMAL模式(PRIMARY、STANDBY模式),无论是否指定启动状态,服务器启动时自动启动到MOUNT状态。

        • 修改DMDSC库的模式必须在DMDSC库所有实例都处于MOUNT状态下才能进行,只需要在一个节点上执行以上语句即可。


        二、达梦数据库状态


        达梦数据库的状态包括startup、mount、after redo、open、suspend、shutdown这几种状态,但不是所有的状态都能相互转换和人工干预。

        2.1 Startup 状态

        系统刚启动时设置为Startup状态。

        2.2 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日志。

            2.3 After Redo 状态

            系统启动过程中联机日志重做完成后,回滚活动事务前设置为After Redo状态。非Standby模式的实例在执行alter database open操作前,也会将系统设置为After Redo状态。

            2.4 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.

                2.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>

                    2.6 Shutdown 状态

                    实例正常退出时设置为Shutdown状态。 

                    数据库状态之间的切换

                    • Open状态与Mount状态可以相互切换;

                    • Open状态与Suspend状态可以相互切换;

                    • Mount和Suspend状态不能直接转换;

                    • 其他状态为系统内部状态,用户不能主动干预。

                    另外, 可以通过参数ALTER_MODE_STATUS来控制是否允许手工修改服务器的模式、状态和OGUID,1:允许;0:不允许。默认为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.
                      • 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.
                        • 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>


                            >>> THE END <<<

                            好,以上是本期干货分享内容,希望能给大家带来帮助。关注本微信公众号,获取更多技术干货!



                             
                             


                            相关推荐

                            干货 | DM8模式及模式下对象的访问
                            干货 | DM数据库开启归档模式的三种方式
                            干货 | DM8系统包-DBMS_ALERT使用小技巧
                            开班 | 达梦DCA在线培训(2022-4月班)开始招生!
                            公开课 | 有福利!超基础的达梦数据库系列公开课免费开享!
                            本文首发于墨天轮,下方“阅读原文”。
                            内容丨李文
                            审核丨青城
                            编辑丨Hh
                            文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论