Oracle Data Guard 角色转换(Role Transitions)
查询视图V$DATABASE的DATABASE_ROLE列可以看到数据库当前的角色。
1.角色转换介绍
Oracle Data Guard让你可以使用SQL语句或者通过Oracle Data Guard broker界面来动态更改数据库的角色,Oracle Data Guard支持以下的角色转换:
1)Switchover
允许主数据库与其中一个备数据库转换角色。在正常切换过程中没有数据丢失。在正常切换后,每个数据库继续以新的角色参与Oracle Data Guard配置。
2)Failover
当主数据库出现故障时改变备数据库到主数据库的角色。如果主数据库在故障前不是运行在最大保护模式或最大可用模式,就会出现数据丢失。如果主数据库的闪回数据库功能被启用,故障的原因被纠正后,原主数据库可以重新以一个新主数据库的备数据库运行。
1.1. 准备角色转换
在角色转换之前,必须确认每个数据库已经正确地配置,备数据库上没有redo传输错误或redo gap。
1)确认每个数据库已经为将获得的角色正确地配置数据库初始化参数,归档模式,备redo日志,在线redo日志等。
注:在每个备数据库上定义LOG_ARCHIVE_DEST_n和LOG_ARCHIVE_DEST_STATE_n参数,这样当switchover或failover发生时,所有的备站点都继续从新的主数据库上接收redo数据。
2)在主数据库上查询视图V$ARCHIVE_DEST_STATUS确认备数据库没有redo传输错误或redo gap。
SQL> SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
STATUS GAP_STATUS
--------- ------------------------
VALID NO GAP
3)确认备数据库上的临时文件与主数据库上的匹配。
SQL> select FILE#,TS#,NAME,STATUS from v$tempfile;
4)移除将成为新主数据库的备数据库上可能在生效的应用redo的时间延迟。不移除这些延迟会导致更长的switchover时间,甚至会不允许进行switchover。
5)在执行switchover切换到在实时查询模式的物理备数据库前,考虑将备数据库的所有实例更改到mount而不是open状态来获得尽可能快的角色转换和干净地终止所有连接到物理备数据库的用户进程。
6)当从Oracle RAC主数据库执行switchover到物理备数据库时,不需要关闭其他只保留一个主数据库实例(it is not necessary to shut down all but one primary database instance)。
1.2. 选择一个角色转换的目标备数据库
对于配置了多个备数据库的Oracle Data Guard,在选择目标备数据库作为角色转换时有以下几方面的因素需要考虑:
1) 备数据库的位置
2) 备数据库的性能(硬件特性—例如CPU,IO带宽等)
3) 执行角色转换需要花费的时间。这受到备数据库在应用redo数据时的延后时间和平衡应用的可用性和数据丢失之间的灵活性等影响。
4) 备数据库类型
作为角色转换的目标数据库的类型决定了配置中其他的备数据库在角色转换之后是如何运行的。如果新的主数据库在角色转换前是物理备数据库,那么配置中所有其他备数据库将成为新主数据库的备数据库。如果新的主数据库在角色转换前是逻辑备数据库,那么配置中所有其他逻辑备数据库将成为新主数据库的备数据库,但是配置中的物理备数据库将继续是旧主数据库的备数据库,因此对新主数据库不提供保护。在后面这种状况中,将来switchover或failover回到原来的主数据库时将所有备数据库返回到最初的角色,作为当前主数据库的备数据库。由于以上所述的原因,物理备数据库通常是同时包含物理和逻辑备数据库配置中最佳的角色转换目标。
注:快照备数据库不能作为角色转换的目标。如果要使用快照备数据库作为角色转换的目标,首先要将它转换为物理备数据库,允许所有从主数据库接收到的redo应用到备数据库。
Oracle Data Guard提供视图V$DATAGUARD_STATS,可以评估每个备数据库的数据的现时性和如果所有可用的redo数据应用到备数据库,执行角色转换需要的时间。
SQL> COLUMN NAME FORMAT A24
SQL> COLUMN VALUE FORMAT A16
SQL> COLUMN DATUM_TIME FORMAT A24
SQL> SELECT NAME, VALUE, DATUM_TIME FROM V$DATAGUARD_STATS;
NAME VALUE DATUM_TIME
------------------------ ---------------- ------------------------
transport lag +00 00:00:00 02/21/2022 17:29:54
apply lag +00 00:00:00 02/21/2022 17:29:54
apply finish time +00 00:00:00.000
estimated startup time 30
1.3. Switchover(计划内切换)
Switchover主要用来在计划内停机时减少主数据库的关闭时间。计划内停机是操作系统或硬件升级,或数据库软件和补丁滚动式升级等事件。
Switchover分两个步骤进行。在第一个步骤中,当前的主数据库转换为备数据库角色;在第二个步骤中,备数据库转换为主数据库。
图9-1显示包含2个站点的Oracle Data Guard在数据库角色转换前的配置,主数据库是San Francisco,备数据库是Boston。
图9-2显示原主数据库转换为备数据库而原备数据库在成为新主数据库之前的Oracle Data Guard环境。在这个阶段,Oracle Data Guard配置临时拥有2个备数据库。
图9-3显示在发生切换后的Oracle Data Guard环境,原备数据库成为了新的主数据库,主数据库现在是Boston,备数据库是San Francisco。
为Switchover准备
确认“准备角色转换”章节的前提条件都已经满足,另外,以下switchover前提条件也必须符合:
1) 对于物理备数据库的切换,确认主数据库是打开状态,备数据库的Redo Apply是Active。
2) 对于逻辑备数据库的切换,确认主备数据库都处于打开状态,SQL Apply是Active。
1.4. Failover(故障切换)
Failover主要用于主数据库不可用时进行切换,而且不可能在合理的时间范围内恢复服务。
图9-4显示从主数据库San Franciso failover到备数据库Boston的结果。
为Failover准备
在执行failover前,尽可能地传输更多可用还未应用的主数据库redo数据到备数据库。
确认“准备角色转换”章节的前提条件都已经满足,另外,以下failover的前提条件也必须符合:
如果备数据库运行在最大保护模式,在备数据库上更改为最大性能模式:
SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
如果有合适的备数据库可用,可以在failover完成以后在新的主数据库上再重新设置需要的保护模式。
这是必须要执行的步骤,因为不能fail over到一个处于最大保护模式的备数据库。另外,如果在最大保护模式的主数据库正在活跃地与备数据库通讯,那么使用这个命令来更改保护模式将不会成功。因为failover会将原主数据库从Oracle Data Guard配置中移除,这个功能用来保护运行在最大保护模式的主数据库不被非计划地failover。
注意:不要fail over到备数据数来进行测试验证备数据库是否正确地进行了更新。
1.5. 角色转换触发器
当角色转换发生时会产生DB_ROLE_CHANGE系统事件,如果数据库在打开状态时,事件会马上发出,如果数据库在关闭状态,事件会在下次打开数据库时发生。
DB_ROLE_CHANGE事件可以用来在角色转换时触发执行一组行为。
2.物理备数据库角色转换
如果运行Oracle数据库12.1以后的版本,执行switchover或failover到物理备数据库的步骤已简化了。以前的步骤也支持(参考“Performing Role Transitions Using Old Syntax”),但Oracle建议使用新的步骤来进行切换。
在角色转换时让物理备数据库的会话保持连接
从Oracle 12.2.0.1版本开始,当物理备数据库转换为主数据库时,可以使用选项来使连接到物理备数据库的会话在switchover/failover过程中保持连接,不会中断。
备实例启动前在init.ora文件中设置STANDBY_DB_PRESERVE_STATES初始化参数,这个参数只适用物理备数据库,可以设置以下值:
1)NONE,用户会话或当前缓存在switchover/failover时不会保留,这是缺省值。
2)ALL,用户会话和当前缓存都在switchover/failover时会保留
3)SESSION,用户会话在switchover/failover时会保留
4)BUFFER,当前缓存在switchover/failover时会保留
2.1. 物理备数据库的正常切换(switchover)
按照以下步骤来执行switchover到物理备数据库:
1)确认目标备数据库已经处于切换就绪状态。
新的switchover语句有VERIFY选项用来执行检查各种switchover要求的条件。检查包括以下项目:Redo Apply是否在切换目标上运行;切换目标是否是12.1以后的版本;切换目标是否同步;切换目标是否有MRP运行。
假设主数据库的DB_UNIQUE_NAME是BOSTON,目标备数据库的DB_UNIQUE_NAME是CHICAGO。在主数据库BOSTON上,执行以下SQL语句确认切换目标CHICAGO是否准备好切换:
SQL> ALTER DATABASE SWITCHOVER TO CHICAGO VERIFY;
ERROR at line 1:
ORA-16470: Redo Apply is not running on switchover target
如果操作成功,将会返回一条“Database Altered”信息,但在这个示例中返回一个ORA-16470错误。这个错误表示switchover目标CHICAGO没有准备好做切换。Redo Apply必须在切换前启动。在Redo Apply启动后,再执行以上语句:
SQL> ALTER DATABASE SWITCHOVER TO CHICAGO VERIFY;
ERROR at line 1:
ORA-16475: succeeded with warnings, check alert log for more details
切换目标CHICAGO已经准备好做切换,但是ORA-16475错误的告警可能会影响切换性能。告警日志包含类似信息:
SWITCHOVER VERIFY WARNING: switchover target has dirty online redo logfiles
that require clearing. It takes time to clear online redo logfiles. This may
slow down switchover process
可以解决好问题或如果切换性能不重要,这些告警可以忽略。在做完必要的处理后,再次执行语句:
SQL> ALTER DATABASE SWITCHOVER TO CHICAGO VERIFY;
Database altered.
切换目标已经准备好做切换。
2)在主数据库上发起切换;
SQL> ALTER DATABASE SWITCHOVER TO CHICAGO;
Database altered.
如果错误发生,mount起旧的主数据库(BOSTON)和旧的备数据库(CHICAGO)。在两个数据库上,查询视图V$DATABASE的DATABASE_ROLE,主备数据库有三种可能的数据库角色组合。下表描述了这些组合,提供了可能的原因和每种状况的修复动作。
主备数据库角色 | 原因和修复动作 |
---|---|
BOSTON是主数据库, CHICAGO是备数据库 | 原因:BOSTON数据库切换到备数据库角色失败 修复动作:检查alert告警日志中阻止BOSTON切换到备数据库的错误,执行相应的操作来解决错误,重新打开BOSTON数据库的一个实例,再次从步骤1执行切换过程 |
BOSTON是备数据库, CHICAGO是备数据库 | 原因:CHICAGO数据库切换到主数据库角色失败 修复动作:执行下面的SQL语句来转换BOSTON或CHICAGO到主数据库 SQL> ALTER DATABASE SWITCHOVER TO target_db_name FORCE; 如果语句失败时报ORA-16473错误,那么必须在再次执行命令前启动Redo Apply。 启动Redo Apply: SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT; 重新执行切换命令: SQL> ALTER DATABASE SWITCHOVER TO BOSTON FORCE; |
BOSTON是备数据库, CHICAGO是主数据库 | 原因:数据库已经成功转换成新的数据库角色,但在将最终成功状态报告给BOSTON时出现错误。 修复动作:继续执行下面的步骤 3来完成切换操作 |
3)在新的主数据库CHICAGO上打开数据库:
SQL> ALTER DATABASE OPEN;
4)MOUNT新的备数据库BOSTON:
SQL> STARTUP MOUNT;
或,如果BOSTON是Oracle Active Database Guard物理备数据库,那么以只读打开它:
SQL> STARTUP;
5)在新的备数据库上启动Redo Apply:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
2.2. 物理备数据库的故障切换(failover)
按照以下步骤执行failover到物理备数据库:
1)如果主数据库可以被挂载,将没有被发送的归档和当前redo日志从主数据库flush到备数据库。如果这个操作成功,即使主数据库不在零数据丢失的保护模式,零数据损失failover是可能的。
首先,确保Redo Apply在目标备数据库是active。然后挂载,但不打开主数据库。如果主数据库不能挂载,跳到步骤2。
在主数据库上执行以下SQL语句:
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
对于target_db_name,指定备数据库的DB_UNIQUE_NAME。语句将没有发送的redo从主数据库flush到备数据库,然后等待redo应用到备数据库。
如果语句完成没有报任何错误,跳到步骤5。如果语句完成时报错,或因为不能等待更长的时间直到语句完成,必须停止,继续步骤2。
2)在目标备数据库上查询V$ARCHIVED_LOG视图获取每个redo线程的最高的日志序号。
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY THREAD#) AS LAST FROM V$ARCHIVED_LOG;
THREAD LAST
---------- ----------1 762 59
如果可能,复制每个主数据库redo线程最近的归档redo日志文件到备数据库,然后注册。
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE ‘filespec1’;
3)在目标备数据库上查询视图V$ARCHIVE_GAP确认在目标备数据库上是否存在redo gap。
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
1 90 92
在这个示例中,gap包括线程1序号90,91和92的归档redo日志文件。
如果可能,复制缺失的归档redo日志文件到目标备数据库并进行注册。
4)步骤3的查询只显示最高的gap。在处理完gap后,再次执行查询直到没有更多的行返回为止。
如果在执行完第2到第4步骤后,不能处理完所有归档redo日志文件的gap(如不能访问故障主数据库的系统),那么在failover过程中就会有数据丢失。
5)在目标备数据库停止Redo Apply。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
6)在目标备数据库上,Failover到目标备数据库。
SQL> ALTER DATABASE FAILOVER TO target_db_name;
如果语句执行完成没有报错,跳到步骤9。
如果语句报错,继续步骤7。
7)如果报错,尝试解决报错的原因,然后重新执行语句。
如果成功,跳到步骤9。
如果错误还是发生,继续步骤8。
8)执行有数据丢失的failover。
如果无法解决错误,可以使用以下SQL语句执行failover:
SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
9)打开新的主数据库:
SQL> ALTER DATABASE OPEN;
10)Oracle建议对新主数据库进行全备。
11)如果Redo Apply在Data Guard配置中的其他的物理备数据库上已经停止,重启它。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
12)在failover后,使用闪回数据库(参考章节“在failover后使用闪回转换故障主数据库到备数据库”)或RMAN备份(参考章节“在角色转换后使用RMAN备份转换故障主数据库到备数据库”)可以将原主数据库可以转换成新主数据库的物理备数据库,或者使用新主数据库的备份来重新创建成为物理备数据库。
一旦原主数据库以备数据库角色运行,就可以执行switchover来恢复它的主数据库角色。
3.逻辑备数据库角色转换
注:逻辑备数据库不复制数据库服务。在切换到逻辑备数据库时,连接到主数据库服务的中间层将不能连接(因为创建的服务不被复制),或者连接到不正确的版本(因为修改的服务属性不被复制)。
Oracle集群件不复制它管理的服务到逻辑备数据库。必须手工在主备数据库间保持服务同步。
3.1. 逻辑备数据库的正常切换(switchover)
当在主数据库和逻辑备数据库之间执行switchover转换角色时,先在主数据库上发起switchover,再在逻辑备数据库上完成。
按照以下步骤来执行switchover到逻辑数据库:
1)在当前主数据库上,查询视图V$DATABASE的SWITCHOVER_STATUS列确认执行switchover是可能的:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO STANDBY
列SWITCHOVER_STATUS的值TO STANDBY或SESSION ACTIVE预示主数据库切换到逻辑备数据库角色是可能的。如果不是这两个值,那么确认Oracle Data Guard的配置运行正常(例如,LOG_ARCHIVE_DEST_n参数设置正确)。
2)在主数据库执行以下SQL语句为当前主数据库准备逻辑备数据库角色:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
语句通知当前主数据库它将很快切换到逻辑备数据库角色,开始从新主数据库接收redo数据。在主数据库上执行这个步骤准备接收记录在当前逻辑备数据库的redo流中的LogMiner字典。
如果操作成功,值PREPARING SWITCHOVER会显示在视图V$DATABASE的列SWITCHOVER_STATUS中。
3)在切换目标逻辑备数据库上使用以下语句建立LogMiner字典:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;
语句还在逻辑备数据库上启动redo传输服务,开始传输它的redo数据到当前主数据库和Oracle Data Guard配置中的其他备数据库。这些从逻辑备数据库接收redo数据的站点接受redo数据但不应用它。
当LogMiner字典开始记录到redo流时,在逻辑备数据库的列V$DATABASE.SWITCHOVER_STATUS初始时显示PREPARING DICTIONARY。当步骤成功完成时,SWITCHOVER_STATUS列显示 PREPARING SWITCHOVER。
4)在完成主数据库到逻辑备数据库角色的转换之前,查询视图V$DATABASE的列SWITCHOVER_STATUS来确认LogMiner字典已经被主数据库接收。如果没有收到LogMiner字典,switchover不能进行下去,因为当前主数据库必须要能解析未来主数据库发送的redo记录。
当查询返回TO LOGICAL STANDBY值时,可以继续步骤5。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO LOGICAL STANDBY
注:可以按顺序执行以下语句来取消switchover操作
a. 在主数据库上取消switchover
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
b. 在逻辑备数据库上取消switchover
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
5)在主数据库执行以下SQL语句完成主数据库到逻辑备数据库的角色转换:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
语句等待主数据库上的所有当前事务停止,禁止任何新用户启动新事务,为switchover提交建立一个时间点。
执行这个语句也禁止用户更改逻辑备数据库上维护的数据。为了确保更快的执行,确认主数据库在执行switchover语句前处于安静的状态(例如,让用户临时从主数据库注销)。可以查询视图V$TRANSACTION来获取当前进行的可能会延时语句执行的事务的状态。
主数据库现在经历到一个逻辑备数据库的角色转换。当主数据库经历到逻辑备数据库的角色转换时,不需要关闭和重启数据库。
6)在完成主数据库到逻辑备数据库的角色转换后,逻辑备数据库会收到switchover的通知。在逻辑备数据库上查询视图V$DATABAE的SWITCHOVER_STATUS列来确认switchover通知正在被目标备数据库处理。一旦所有可用的redo记录应用到了逻辑备数据库,在预料到预期的角色转换时,SQL Apply会自动关闭。
在switchover过程中SWITCHOVER_STATUS列的值会更新来显示进度。当状态是TO PRIMARY时,继续步骤7。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
7)在要切换为主数据库角色的逻辑备数据库上使用以下SQL语句切换逻辑备数据库到主数据库角色:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
不需要关闭和重启Oracle Data Guard配置中的任何逻辑备数据库。如前面“选择一个角色转换的目标备数据库”所述,配置中的所有其他逻辑备数据库会成为新的主数据库的备数据库,任何物理备数据库依旧是原主数据库的备数据库。
8)在新的逻辑备数据库上,启动SQL Apply:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
3.2. 逻辑备数据库的故障切换(failover)
取决于配置的保护模式和redo传输服务的属性,可能可以自动恢复所有或部分主数据库的修改。
按照以下步骤执行failover到逻辑备数据库:
1)如果主数据库可以被挂载,将没有被发送的归档和当前redo日志从主数据库flush到备数据库。如果这个操作成功,即使主数据库不在零数据丢失的保护模式,零数据损失failover是可能的。
首先,确保Redo Apply在目标备数据库上是active。然后挂载,但不打开主数据库。如果主数据库不能挂载,跳到步骤2。
在主数据库上执行以下SQL语句:
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
对于target_db_name,指定备数据库的DB_UNIQUE_NAME。语句将没有发送的redo从主数据库flush到备数据库,然后等待redo应用到备数据库。
2)取决于配置中组件的条件,你可能可以访问主数据库上的归档redo日志文件。如果这样,执行以下操作:
a. 确认在逻辑备数据库上是否缺失任何归档redo日志文件。
SELECT FILE_NAME, SEQUENCE# AS SEQ#, FIRST_CHANGE# AS F_SCN#, NEXT_CHANGE# AS N_SCN#, TIMESTAMP, DICT_BEGIN AS BEG, DICT_END AS END, THREAD# AS THR#, APPLIED FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;
b. 从主数据库上拷贝缺失的日志文件到逻辑备数据库。
c. 注册拷贝的日志文件。
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE ‘filespec1’;
3)在目标逻辑备数据库上执行以下命令:
SQL> ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY;
语句停止RFS(remote file server)进程,在逻辑备数据库成为主数据库之前应用备redo日志文件中的剩余的redo数据,停止SQL Apply,然后激活数据库为主数据库角色。
如果没有指定FINISH APPLY子语句,那么在当前备redo日志文件中的没有应用的redo将不会在逻辑备数据库成为主数据库之前被应用。
4) 按照以下章节“在故障切换后配置逻辑备数据库”描述的方法确认现存的逻辑备数据库可以继续为新主数据库提供保护。
5) 在failover后对新主数据库做全备。
6) 在failover后,使用闪回数据库(参考章节“在failover后使用闪回转换故障主数据库到备数据库”)或RMAN备份(参考章节“在角色转换后使用RMAN备份转换故障主数据库到备数据库”)可以将原主数据库可以转换成新主数据库的逻辑备数据库,或者使用新主数据库的备份来重新创建成为逻辑备数据库。
一旦原主数据库以备数据库角色运行,就可以执行switchover来恢复它的主数据库角色。
4 .在物理备数据库或逻辑备数据库故障切换后配置其它逻辑备数据库
在主数据库故障切换到另外一个备数据库后,这些步骤要求在逻辑备数据库上执行。
在故障切换发生后,逻辑备数据库不能作为新的主数据库的备数据库直到它应用了原主数据库的最后的redo为止。这与新主数据库在故障切换中应用了最后的redo的方式相似。必须执行的步骤取决于新主数据库在故障切换前是物理备数据库还是逻辑备数据库。
4.1. 当新主数据库原来是物理备数据库
这些步骤演示了如何配置逻辑备数据库来支持在获取主角色前是物理备数据库的新主数据库。
在这个场景中,SAT是逻辑备数据库,NYC是主数据库。
1) 在SAT数据库上,执行以下语句配置FAL_SERVER参数来启用自动恢复日志文件。
SQL> ALTER SYSTEM SET FAL_SERVER=‘<tns_name_to_new_primary>’;
SQL> ALTER SYSTEM SET FAL_CLIENT=‘<tns_name_to_local_database>’;
2)调用PREPARE_FOR_NEW_PRIMARY程序来确认逻辑备数据库能够作为新主数据库的备数据库服务。在这个步骤中,造成数据分歧风险的日志文件的本地拷贝会从本地数据库删除。这些日志文件然后直接从主数据库请求重新归档。
在SAT数据库上,执行以下语句:
SQL> EXECUTE DBMS_LOGSTDBY.PREPARE_FOR_NEW_PRIMARY( former_standby_type => ‘PHYSICAL’ dblink => ‘nyc_link’);
注:如果返回消息ORA-16109和有告警“LOGSTDBY: prepare_for_new_primary failure – applied too far, flashback required.”写入到alert.log,执行以下步骤:
a. 闪回数据库到告警中说明的SCN;
b. 重新执行这个步骤。
3)在SAT数据库上,执行以下语句来启动SQL Apply:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
4.2. 当新主数据库原来是逻辑备数据库
这些步骤演示了如何配置逻辑备数据库来支持在获取主角色前是逻辑备数据库的新主数据库。
在这个场景中,SAT是逻辑备数据库,NYC是主数据库。
1)确认新主数据库已经准备好支持逻辑备数据库。在NYC数据库上,确认下面的查询返回值NONE。否则新主数据库还没有完成需要启用逻辑备数据库支持的工作。例如:
SQL> SELECT PENDING_ROLE_CHANGE_TASKS FROM V$DATABASE;
在尝试恢复旧主数据库前,值NONE必须被返回。
2) 在SAT数据库上,执行以下语句来配置FAL_SERVER参数来启动自动恢复日志文件:
SQL> ALTER SYSTEM SET FAL_SERVER=‘<tns_name_to_new_primary>’;
SQL> ALTER SYSTEM SET FAL_CLIENT=‘<tns_name_to_local_database>’;
3)调用PREPARE_FOR_NEW_PRIMARY程序来确认逻辑备数据库能够作为新主数据库的备数据库服务。在这个步骤中,造成数据分歧风险的日志文件的本地拷贝会从本地数据库删除。这些日志文件然后直接从主数据库请求重新归档。
在SAT数据库上,执行以下语句:
SQL> EXECUTE DBMS_LOGSTDBY.PREPARE_FOR_NEW_PRIMARY( former_standby_type => ’ LOGICAL ’ dblink => ‘nyc_link’);
注:如果返回消息ORA-16109和有告警“LOGSTDBY: prepare_for_new_primary failure – applied too far, flashback required.”写入到alert.log,执行以下步骤:
c. 闪回数据库到告警中说明的SCN;
d. 重新执行这个步骤。
4)在SAT数据库上,执行以下语句来启动SQL Apply:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARY
nyc_link;
语句必须不启用实时应用选项来执行。为了在逻辑备数据库上启用实时应用,等待以上语句成功完成,然后执行以下语句:
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
5.在角色转换后使用闪回
在角色转换后,可以选择使用FLASHBACK DATABASE命令来将数据库恢复到角色转换前的时间点或SCN。
如果闪回主数据库,那么必须闪回所有它的备数据库到相同的或早些的SCN或时间。当闪回主数据库或备数据库时,不需要管过去的switchover。只要SCN/时间早于过去的switchover,Oracle就能自动闪回跨越过去的switchover。
注:在角色转换发生前闪回数据库必须已经在数据库上启用。
5.1. 在switchover后使用闪回
在switchover之后,可以使用FLASHBACK DATABASE命令将数据库恢复到switchover前的时间点或SCN。
如果switchover涉及物理备数据库,在闪回操作中主备数据库的角色会保留。当数据库闪回到目标SCN或时间点时,数据库运行的角色不会更改。数据库在switchover后运行在物理备数据库角色但在闪回时间点之前是主数据库角色,在闪回数据库操作之后将仍然运行在物理备数据库角色。
如果switchover涉及逻辑备数据库,闪回会更改备数据库的角色到目标SCN或时间点时它所在的数据库角色。
5.2. 在failover后使用闪回转换故障主数据库到备数据库
在failover发生后,原主数据库不能再加入Oracle Data Guard的配置,直到它被修复和作为新配置的备数据库建立为止。
可以使用闪回将故障的主数据库恢复到在故障发生前的时间点,然后将它转换为新配置的备数据库。
5.2.1.闪回故障主数据库到物理备数据库
以下步骤将旧的主数据库作为物理备数据库恢复到Oracle Data Guard配置中。下面的步骤假设failover已经在物理备数据库上执行和在failover时闪回已经在旧的主数据库上启用。
1)在新主数据库上,查询确定旧备数据库变成新主数据库时的SCN:
SQL> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;
2)关闭旧主数据库(如果需要),挂载它,闪回到前面步骤中确定的STANDBY_BECAME_PRIMARY_SCN的值。
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> FLASHBACK DATABASE TO SCN standby_became_primary_scn;
3) 在旧主数据库上转换数据库到物理备数据库:
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
4) 在新物理备数据库上启动redo传输,在新主数据库上执行以下步骤:
a. 执行以下查询查看归档目标的当前状态:
col dest_name format a20
col destination format a30
col error format a30
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION, ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
b. 如果需要,启用传输目标
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_n=ENABLE;
c. 执行日志切换来确保备数据库开始从新主数据库接收redo数据,并确认redo发送成功。
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION, ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
5)在新物理备数据库上启动Redo Apply
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
Redo Apply每次遇到角色转换产生的redo记录时就会自动停止,所以需要重新启动Redo Apply一次或多次直到它已经应用新主数据库变成主数据库时的SCN之后为止。
一旦故障主数据库恢复和运行在备数据库角色,可以选择执行switchover转换数据库到它原来(故障前)的角色。
5.2.2.闪回故障主数据库到逻辑备数据库
以下步骤将旧的主数据库作为新的逻辑备数据库恢复到Oracle Data Guard配置中,不必从新主数据库正式实例化来实现。
下面的步骤假设Oracle Data Guard配置已经在逻辑备数据库上完成failover和在failover时闪回已经在旧的主数据库上启用。
1)在新主数据库上,查询确定闪回SCN和恢复SCN。闪回SCN是故障主数据库闪回的SCN,恢复SCN是故障数据库恢复的SCN。在新主数据库执行以下查询确认这些SCN:
SQL> SELECT merge_change# AS FLASHBACK_SCN, processed_change# AS RECOVERY_SCN
FROM DBA_LOGSTDBY_HISTORY
WHERE stream_sequence# = (SELECT MAX(stream_sequence#)-1
FROM DBA_LOGSTDBY_HISTORY);
2)闪回故障主数据库到在前面步骤中确认的闪回SCN:
SQL> FLASHBACK DATABASE TO SCN flashback_scn;
3)转换故障主数据库到物理备数据库,重新挂载备数据库为恢复做准备:
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
4)配置参数FAL_SERVER来启动自动恢复日志文件。在物理备数据库(原故障主数据库)上执行以下命令:
SQL> ALTER SYSTEM SET FAL_SERVER=‘<tns_name_to_new_primary>’;
5)删除任何在failover过程中或之后从故障主数据库中创建的归档日志。如果故障主数据库与备数据库隔离,它可能会有与当前主数据库不一致的有分歧的归档日志。为了确保这些有分歧的归档日志决不会应用,必须从备份和快速恢复区域中删除。可以使用以下RMAN命令从快速恢复区域中删除相关的归档日志:
RMAN> DELETE FORCE ARCHIVELOG FROM SCN FLASHBACK_SCN;
一旦删除,这些有分歧的日志和随后的事务将不可能再恢复。
6)恢复直到步骤1中确定的恢复SCN:
SQL> RECOVERY MANAGED STANDBY DATABASE UNTIL CHANGE recovery_scn;
7)启动数据库保护
SQL> ALTER DATABASE GUARD ALL;
8)激活物理备数据成为主数据库:
SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;
9)打开数据库:
SQL> ALTER DATABASE OPEN;
10)创建一个到新主数据库的数据库链接,启动SQL Apply:
SQL> CREATE PUBLIC DATABASE LINK mylink
CONNECT TO system IDENTIFIED BY password
USING ‘service_name_of_new_primary_database’;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARY mylink;
5.3.闪回逻辑备数据库到特定的应用SCN
备数据库的其中一个好处是闪回可以在备数据库上执行而不影响主数据库服务。闪回数据库到一个指定的时间点是一个直接明确的任务,然而,在逻辑备数据库上,可以闪回到一个正好在某个已知被提交的事务之前的时间。在failover后当配置一个新主数据库的逻辑备数据库时可能会出现这样的需求。以下步骤描述如何使用闪回数据库和SQL Apply来恢复到一个已知的应用SCN。
1)一旦在主数据库上确定了已知的SCN(APPLIED_SCN),在逻辑备数据库上查询确定相应的用来闪回操作的SCN。
SQL> SELECT DBMS_LOGSTDBY.MAP_PRIMARY_SCN (PRIMARY_SCN => APPLIED_SCN) -
AS TARGET_SCN FROM DUAL;
2)闪回逻辑备数据库到指定SCN,然后使用RESETLOGS选项打开逻辑备数据库:
SQL> SHUTDOWN;
SQL> STARTUP MOUNT EXCLUSIVE;
SQL> FLASHBACK DATABASE TO SCN <TARGET_SCN>;
SQL> ALTER DATABASE OPEN RESETLOGS;
3)查询确认SQL Apply已经应用小于或直到APPLIED_SCN:
SQL> SELECT APPLIED_SCN FROM V$LOGSTDBY_PROGRESS;
6.在角色转换后使用RMAN备份转换故障主数据库到备数据库
如果故障主数据库的闪回数据库功能没有启用,可以使用故障主数据库的本地备份转换故障主数据库到物理或逻辑备数据库。
6.1.使用RMAN备份转换故障主数据库到物理备数据库
步骤要求旧主数据库的COMPATIBLE初始化参数至少设置为11.0.0。
1)在新主数据库上,查询确定旧备数据库变成新主数据库时的SCN:
SQL> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;
2)使用旧主数据库到达备数据库成为新主数据库的SCN(standby_became_primary_scn)前的备份还原数据库。然后,执行时间点恢复来恢复旧主数据库到相同的点。
RMAN> RUN
{
SET UNTIL SCN <standby_became_primary_scn + 1>;
RESTORE DATABASE;
RECOVER DATABASE;
}
对于用户管理的恢复,可以先手工还原数据库,然后使用以下命令恢复故障主数据库:
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CHANGE <standby_became_primary_scn + 1>;
不像使用闪回数据库的重新实例化,这个步骤增加1到standby_became_primary_scn。对于数据文件,闪回到一个SCN是和恢复到SCN加1等同的。
3)将旧主数据库上转换到物理备数据库,然后重新挂载
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
4)以只读方式打开数据库:
SQL> ALTER DATABASE OPEN READ ONLY;
这个步骤的目标是使用目录检查来将控制文件与数据库同步。命令执行后,检查alert日志中是否有目录检查建议的行为。如果旧主数据库不是在failover过程中增加或删除数据文件的话,通常不需要用户介入。
5)如果已经购买Oracle Active Data Guard选项的授权和希望让物理备数据库运行在活动查询模式,跳过这个步骤。否则,将数据库切换到挂载状态:
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
6) 在新备数据库创建前,新主数据库可能已经停止向远程目标传输redo。在新主数据库上执行以下步骤重新启动redo传输服务。
a. 查看归档目标的当前状态:
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION, ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
b. 如果需要,启用传输目标:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_n=ENABLE;
c. 执行日志切换来确保备数据库开始从新主数据库接收redo数据和确认redo发送成功。
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION, ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
7)在新物理备数据库上启动Redo Apply:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
一旦故障主数据库恢复和运行在备数据库角色,可以选择执行switchover转换数据库到它原来(故障前)的角色。
6.2.使用RMAN备份转换故障主数据库到逻辑备数据库
以下步骤描述如何使用RMAN备份将故障主数据库转换到逻辑备数据库。
1)在新主数据库上,查询和确定想恢复故障主数据库到的SCN:
SQL> SELECT APPLIED_SCN RECOVERY_SCN FROM V$LOGSTDBY_PROGRESS;
同样在新主数据库上,确定处理归档日志使用的SCN,如下:
a. 确保所有备redo日志已经被归档。发出以下查询,直到NONE值返回为止。取决于数据库的大小和需要归档的日志数量,在返回NONE状态之前可能要花费一些时间。
SQL> SELECT PENDING_ROLE_CHANGE_TASKS FROM V$DATABASE;
b.在返回NONE状态之后,执行以下查询获取作为恢复操作的一部分处理归档日志的SCN。
SQL> SELECT VALUE ARCHIVE_SCN FROM SYSTEM.LOGSTDBY$PARAMETERS
WHERE NAME=‘STANDBY_BECAME_PRIMARY_SCN’;
2)删除任何在failover过程中或之后从故障主数据库中创建的归档日志。如果故障主数据库与备数据库隔离,它可能会有与当前主数据库不一致的有分歧的归档日志。为了确保这些有分歧的归档日志决不会被应用,必须从备份和快速恢复区域中删除。可以使用以下RMAN命令从快速恢复区域中删除相关的归档日志:
RMAN> DELETE FORCE ARCHIVELOG FROM SCN ARCHIVE_SCN;
一旦删除,这些有分歧的日志和随后的事务将不可能再恢复。
3) 在新主数据库上,查询确定在从备份恢复前必须拷贝到故障主数据库上最少量的日志文件集:
SQL> SELECT file_name FROM DBA_LOGSTDBY_LOG WHERE next_change# > ARCHIVE_SCN;
检索要求的备日志,拷贝备份集到新备数据库上,然后还原到新备数据库的快速恢复区。因为这些日志来自备redo日志,他们不是备数据库的标准归档日志。RMAN可以使用部分文件名称来从正确的位置检索文件:
RMAN> BACKUP AS COPY DEVICE TYPE DISK FORMAT ‘/tmp/test/%U’
ARCHIVELOG LIKE ‘%’;
RMAN> CATALOG START WITH ‘/tmp/test’;
RMAN> RESTORE ARCHIVELOG FROM SEQUENCE 33 UNTIL SEQUENCE 35;
4)还原包含所有原主数据库的数据文件的备份,恢复到RECOVERY_SCN+1。Oracle建议充分利用当前控制文件。
a. 启动数据库到受限制模式,保护数据库不受意外的事务影响直到在打开数据库后可以执行GUARD ALL命令为止
b. 使用备份还原故障主数据库的数据文件
c. 关闭闪回数据库,如果它是启用的话(对于子语句USING BACKUP CONTROLFILE是必要的)
d. 在SQL*PLUS中执行时间点恢复到RECOVERY_SCN+1
不管是使用当前控制文件还是备份控制文件,必须指定子语句USING BACKUP CONTROLFILE来允许指向还原的归档日志。否则,恢复进程将会尝试访问在线redo日志而不是步骤3中检索到的日志。当提示步骤3中检索到的序列时,确保指定了还原的归档日志文件拷贝的文件名称:
SQL> RECOVER DATABASE UNTIL CHANGE RECOVERY_SCN + 1 USING BACKUP CONTROLFILE;
5)使用选项RESETLOGS打开数据库:
SQL> ALTER DATABASE OPEN RESETLOGS;
6)启动数据库保护
SQL> ALTER DATABASE GUARD ALL;
7)创建一个到新主数据库的数据库链接,启动SQL Apply:
SQL> CREATE PUBLIC DATABASE LINK mylink
CONNECT TO system IDENTIFIED BY password
USING ‘service_name_of_new_primary_database’;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARY mylink;
此时,可以停止限制会话(ALTER SYSTEM DISABLE RESTRICTED SESSION),或者如果需要重启数据库来重新启用步骤4c中禁用的闪回,让重启来关闭RESTRICTED SESSION。
来源:《Oracle Data Guard Concepts and Administration, 19c》
相关文章:
Oracle Data Guard 角色转换(Role Transitions)
查询视图V$DATABASE的DATABASE_ROLE列可以看到数据库当前的角色。 1.角色转换介绍 Oracle Data Guard让你可以使用SQL语句或者通过Oracle Data Guard broker界面来动态更改数据库的角色,Oracle Data Guard支持以下的角色转换: 1࿰…...
opencv的TrackBar控件
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...
关于基线长度对双天线GNSS测姿精度的影响
文章目录一、GNSS测姿原理1. 载波相位双差求解基线向量2. GNSS姿态角表示二、基线长度对GNSS测姿精度的影响三、GNSS定向产品精度描述实例四、参考文献在GNSS定向模块或者板卡的指标参数中,我们一般会看到航向的测量精度和基线的长度相关。在实际使用,用…...
口交换机睿易 RG-NBS1826GC 24 口
接口形态不将就,标配光纤接口传输性能不将就,标配千兆上联口和大缓存设计端口数量不将就,8/16/24 三种选择楼宇对讲交换机不将就,保证开锁指令品质服务不将就,监控专用交换机接口形态不将就,标配光纤接口非…...
如何在Excel中向下拉列表中添加条件
在Excel中向下拉列表中添加条件 创建矩阵型数据集创建下拉列表创建第一个下拉列表创建第二个下拉列表你可以使用Microsoft Excel下拉列表来显示一个简单的列表,尽管有时需要更多的控制。假设你的人员分散在四个地区:北部、南部、东部和西部。你希望按地区与人员合作,而不是与…...
自定义bean 加载到spring IOC容器中
自定义bean加载到spring容器中的两种方式: 1.在类上添加注解Controller、RestController(本质是Controller)、Service、Repository、Component2.使用Configuration和Bean 这篇文章主要介绍第二种方式原理(因为在实际使用中&#…...
[python入门㊻] - python装饰器和类的装饰器
目录 ❤ python装饰器介绍 ❤ 什么是装饰器 ❤ 装饰器的流程 ❤ 定义装饰器时通常会涉及以下3个函数 无参装饰器 有参装饰器 多重装饰器 ❤ 装饰器的用法(闭包) ❤ 装饰器语法糖 ❤ 时间计时器 ❤ 装饰器中wraps作用 不使用wraps装饰器 使用wraps装饰器解…...
企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean
文章目录一、Spring容器演示——采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Spring依赖(三)创建杀龙任务类(四)创建勇敢骑士类(五)采用传统方式让勇…...
CSS盒子模型
盒子模型 CSS三大特性 继承性、层叠性、优先级 优先级比较 继承 < 通配符选择器 < 标签选择器 < 类选择器 < id选择器 < 行内样式 < !important 注意:!important不能提升继承的优先级,只要是继承优先级最低 复合选择器权重叠加计…...
Python基础学习笔记 —— 数据结构与算法
数据结构与算法1 数据结构基础1.1 数组1.2 链表1.3 队列1.4 栈1.5 二叉树2 排序算法2.1 冒泡排序2.2 快速排序2.3 (简单)选择排序2.4 堆排序2.5 (直接)插入排序3 查找3.1 二分查找1 数据结构基础 本章所需相关基础知识:…...
笔记本连接wifi,浏览器访问页面,显示访问被拒绝
打开chrome、edge浏览器访问第1个第2个页面正常,后面再打开页面显示异常。 但手机连接正常,笔记本连接异常,起初完全没有怀疑是wifi问题 以为用了vpn软件问题,认为中了病毒。杀毒,并没有中毒。 1、关闭vpn代理&#…...
36个物联网专业毕业论文选题推荐
物联网技术在智能家居系统中的应用研究物联网在智慧城市建设中的作用物联网在工业4.0中的实现与发展 物联网与智能物流系统的结合物联网与医疗健康领域的融合研究物联网与环境监测系统的集成物联网与农业生产的结合研究物联网技术对汽车行业的影响与发展物联网在智能安防领域的…...
Pytorch复习笔记--torch.nn.functional.interpolate()和cv2.resize()的使用与比较
1--前言 博主在处理图片尺度问题时,习惯使用 cv2.resize() 函数;但当图片数据需用显卡加速运算时,数据需要在 GPU 和 CPU 之间不断迁移,导致程序运行效率降低; Pytorch 提供了一个类似于 cv2.resize() 的采样函数&…...
ASP.NET Core MVC 项目 AOP之ActionFilterAttribute
目录 一:说明 二:实现ActionFilterAttribute父类 一:说明 ActionFilterAttribute比前两者简单方便,易于扩展,不易产生代码冗余。 ActionFilterAttribute过滤器执行顺序: 1:执行控制器中的构造函数,实例化控制器 2:执行ActionFilterAttribute.OnActionExecutionA…...
浅析EasyCVR安防视频能力在智慧小区建设场景中的应用及意义
一、行业需求 城市的发展创造了大量工作机会,人口的聚集也推动了居民住宅建设率的增长。人民生活旨在安居乐业,能否住得“踏实”是很多劳动工作者最关心的问题。但目前随着住宅小区规模的不断扩大、人口逐渐密集,在保证居住环境舒适整洁的同…...
Python的深、浅拷贝到底是怎么回事?一篇解决问题
嗨害大家好鸭!我是小熊猫~ 一、赋值 Python中, 对象的赋值都是进行对象引用(内存地址)传递, 赋值(), 就是创建了对象的一个新的引用, 修改其中任意一个变量都会影响到另一个 will …...
TCP协议十大特性
日升时奋斗,日落时自省 目录 1、确认应答 1.1、序号编辑 2、超时重传 3、连接管理 3.1、三次握手 3.2、四次挥手 4、滑动窗口 5、流量控制 6、拥塞控制 7、延时应答 8、捎带应答 9、面向字节流 10、异常情况 TCP协议: 特点:有…...
2.14作业【GPIIO控制LED】
设备树 myleds{ myled1 <&gpioe 10 0>; myled2 <&gpiof 10 0>; myled3 <&gpioe 8 0>; }; 驱动代码 #include<linux/init.h> #include<linux/module.h> #include<linux/of.h&…...
5min搞定linux环境Jenkins的安装
5min搞定linux环境Jenkins的安装 安装Jenkinsstep1: 使用wget 命令下载Jenkinsstep2、创建Jenkins日志目录并运行jekinsstep3、访问jenkins并解锁jenkins,安装插件以及创建管理员用户step4、到此,就完成了Finish、以上步骤中遇到的问题1、 jenkins启动不了2、jenkins无法访问…...
Cortex-M0存储器系统
目录1.概述2.存储器映射3.程序存储器、Boot Loader和存储器重映射4.数据存储器5.支持小端和大端数据类型数据对齐访问非法地址多寄存器加载和存储指令的使用6.存储器属性1.概述 Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间&…...
软件测试——测试用例之场景法
一、场景法的应用场合 场景法主要用于测试软件的业务流程和业务逻辑。场景法是基于软件业务的测试方法。在场景法中测试人员把自己当成最终用户,尽可能真实的模拟用户在使用此软件的操作情景: 重点模拟两类操作: 1)模拟用户正确…...
英文写作中的常用的衔接词
1. 增补 (Addition) in addition, furthermore, again, also, besides, moreover, whats more, similarly, next, finally 2.比较(Comparision) in the same way, similarly, equally, in comparison, just as 3. 对照 (Contrast) in contrast, on …...
新库上线 | CnOpenData中国地方政府债券信息数据
中国地方政府债券信息数据 一、数据简介 地方政府债券 指某一国家中有财政收入的地方政府地方公共机构发行的债券。地方政府债券一般用于交通、通讯、住宅、教育、医院和污水处理系统等地方性公共设施的建设。地方政府债券一般也是以当地政府的税收能力作为还本付息的担保。地…...
Python 条件语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。 Python 编…...
C语言思维导图大总结 可用于期末考试 C语言期末考试题库
目录 一.C语言思维导图 二.C语言期末考试题库 一.C语言思维导图 导出的图可能有点糊,或者查看链接:https://share.weiyun.com/uhf1y2mp 其实原图是彩色的不知道为什么导出时颜色就没了 部分原图: 也可私信我要全图哦。 图里的链接可能点不…...
从零实现深度学习框架——再探多层双向RNN的实现
来源:投稿 作者:175 编辑:学姐 往期内容: 从零实现深度学习框架1:RNN从理论到实战(理论篇) 从零实现深度学习框架2:RNN从理论到实战(实战篇) 从零实现深度…...
Flink 连接流详解
连接流 1 Union 最简单的合流操作,就是直接将多条流合在一起,叫作流的“联合”(union)。联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变。这种合流方式非常简…...
分享112个HTML电子商务模板,总有一款适合您
分享112个HTML电子商务模板,总有一款适合您 112个HTML电子商务模板下载链接:https://pan.baidu.com/s/13wf9C9NtaJz67ZqwQyo74w?pwdzt4a 提取码:zt4a Python采集代码下载链接:采集代码.zip - 蓝奏云 有机蔬菜水果食品商城网…...
2023备战金三银四,Python自动化软件测试面试宝典合集(八)
马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...
J-Link RTT Viewer使用教程(附代码)
目录 RTT(Real Time Transfer)简介 使用教程 常用API介绍 RTT缓冲大小修改 使用printf重定向 官方例程 RTT(Real Time Transfer)简介 平常调试代码中使用串口打印log,往往需要接出串口引脚,比较麻烦,并且串口打印速度较慢,串…...
通用企业网站模板/网络营销的理解
sudo apt-get install libncurses5-dev...
手机网站分享/企业管理培训班哪个好
RxJS 系列目录 RxJS 系列之一 - Functional Programming 简介 RxJS 系列之二 - Observable 详解RxJS 系列之三 - Operators 详解RxJS 系列之四 - Subject 详解 (本文)RxJS 系列之五 - RxJS 实战 (未完成)RxJS 系列之六 - RxJS 在 Angular 2 中的应用 (未完成)Observer Pattern …...
4399网站做游戏赚钱/中央人民政府
我听到的一些发声 你们赚的钱已经可以了: 我一个发小是做土木工程的,上海大学博士,参与很多著名建筑的工程,但是从薪资上看,还不如一些稍微像样的公司的6年多的高级开发。为什么?这就是行业的红利…...
阿里爸爸网站建设策划书/免费seo视频教学
日前,我司 CTO 黄东旭接受了即将开幕的 WOT2018 全球软件与运维技术峰会记者的采访,介绍了 TiDB 作为 HTAP 数据库的技术思考及应用情况,以及 PingCAP 自创立以来对开源的一些心得,以下是报道原文。Enjoy~作者…...
wordpress反应很慢/济南计算机培训机构哪个最好
方法一: 选择添加——现有项,将排除的文件添加进来。 方法二: 在解决方案资源管理器上方有一排小按钮,找到那个显示所有文件,点击后,将显示你被排除的文件,然后再在这个文件上点击右键ÿ…...
手机微信一体网站建设/北京seo如何排名
为什么80%的码农都做不了架构师?>>> 阻塞队列:只是队列的拓展,传统队列当满的时候会抛出异常,而阻塞队列会一直等待,不会报错,当然,里面包含的方法如下: 抛出异常特殊值…...