• 管理RMAN备份_维护RMAN备份和仓库记录


    1.RMAN备份和仓库维护概述

    1.1.备份和仓库维护的目的

    建议的维护策略是配置一个快速恢复区域,一个备份保留策略和一个归档 redo日志删除策略。在这种情况中,数据库按需要自动维护和删除备份与归档redo日志。然而,有时手动维护数据库备份和归档redo日志是必要的。

    管理RMAN备份涉及到以下相关的任务:
    1)管理存储在磁盘或磁带上的数据库备份
    2)管理在RMAN仓库中的那些备份的记录

    RMAN维护的一个重要部分是删除不再需要的备份。如果配置一个快速恢复区域,那么数据库自动删除这个区域中不需要的文件。即使如此,你可能想从磁带上删除备份和副本。你甚至需要删除整个数据库。你可以使用RMAN命令来执行这些任务。

    快速恢复区域可能要求不定期的维护。例如,快速恢复区域可能变满了,在这个情况中可以增加空间到快速恢复区域。可替代地,你可能想更改快速恢复区域的位置。

    RMAN仓库有可能没有正确反映磁盘或磁带上文件的真实状态。例如,用户可能使用操作系统工具从磁盘上删除了备份。在这个情况中,RMAN仓库显示文件存在但实际上它不存在。在类似的情况中,包含RMAN备份的磁带可能损坏了。可以使用RMAN维护命令来使用准确的信息更新仓库。


    1.2.备份和仓库维护的基本概念

    RMAN提供多个命令来维护RMAN备份和仓库记录。

    以下是RMAN的维护命令:
    1)CATALOG命令让你可以增加关于当前没有记录在RMAN仓库中的RMAN和用户管理的备份的记录,或删除已经记录的备份的记录。
    2)CHANGE命令让你更新在RMAN仓库中的记录的状态。
    3)CROSSCHECK命令让你使用在备份存储中文件的物理真实状况来同步逻辑备份记录。
    4)DELETE命令让你可以从操作系统中删除备份。


    1.2.1.关于维护命令和RMAN仓库元数据

    RMAN总是存储它的元数据在每个它执行操作的目标数据库的控制文件中。如果在恢复目录中注册了一个目标数据库,那么RMAN存储目标数据库的元数据在恢复目录中。

    所有RMAN维护命令与恢复目录或不与恢复目录一起工作。


    1.2.2.关于Data Guard环境中的维护命令

    在Data Guard环境中创建备份或副本的数据库与这些文件关联。例如,如果RMAN连接到目标数据库standby1和备份它,那么这个备份与standby1关联。

    如果根据“关于Data Guard环境中的RMAN文件管理”章节的标准,备份可以被RMAN访问的,当连接到任何主或备数据库时,对备份可以使用RMAN维护命令比如CHANGE,DELETE和CROSSCHECK。


    1.2.2.1.关于Data Guard环境中的交叉检查

    对于交叉检查,当连接到与文件相关的数据库时,RMAN只能更新文件的状态从AVAILABLE到EXPIRED。

    因此,如果RMAN交叉检查一个文件和没有找到它,但没有作为TARGET连接到与文件相关联的数据库,那么当连接到与文件相关联的目标数据库时,RMAN会提示执行交叉检查。当运行CROSSCHECK或CHANGE … AVAILABLE命令时,RMAN执行交叉检查。


    1.2.2.2.关于Data Guard环境中的删除

    当连接到任何数据库时,RMAN可以删除文件。如果RMAN没有作为TARGET连接到与文件相关联的数据库和如果RMAN不能成功删除一个文件,那么RMAN会提示作为TARGET连接到与文件相关联的数据库。此时必须使用DELETE … FORCE来删除文件的元数据。


    1.2.2.3.关于在Data Guard环境中更新RMAN元数据

    如果维护命令只更改RMAN元数据,那么可以作为TARGET连接RMAN到Data Guard环境中的任何数据库。

    只更改元数据的命令包括:
    1) CHANGE … UNAVAILABLECHANGE … UNCATALOG
    2) CHANGE … KEEPCHANGE … NOKEEP
    3) CHANGE … RESET DB_UNIQUE_NAME

    缺省情况下,CHANGE命令只操作根据章节“关于Data Guard环境中备份的可访问性”指定的规则可以访问的文件。然而,可以使用FOR DB_UNIQUE_NAME选项更改与除了目标数据库之外的数据库相关联的文件的状态。


    1.2.2.4.关于不与数据库关联的文件

    备份保持与数据库关联除非明确使用CHANGE … RESET DB_UNIQUE_NAME命令关联备份到其它数据库。

    在某些情况中,DB_UNIQUE_NAME可能对一个指定的文件是未知的。例如,当数据库的名称不被恢复目录所知的时候,正如注册在恢复目录中的Oracle 9i数据库一样,DB_UNIQUE_NAME的值是null。同样,行的DB_UNIQUE_NAME的值可以是null,因为数据库已经升级到当前版本,但恢复目录模式还没有核查(reconcile)所有文件的DB_UNIQUE_NAME值。缺省情况下,RMAN关联SITE_KEY值为null的文件到RMAN作为TARGET连接的数据库。


    2.维护控制文件仓库

    RMAN被设计为没有恢复目录也能工作。如果选择不使用恢复目录,那么每个目标数据库的控制文件是RMAN元数据专用的仓库。

    你必须知道信息是如何存储在控制文件中,确保备份和恢复策略可以保护控制文件。


    2.1.关于控制文件记录

    控制文件包含两种记录类型:循环重用的记录和非循环重用的记录。

    循环重用的记录包含非关键的信息,在需要时可以被覆盖。这些记录包含数据库持续在生成的信息。当所有可用的记录位置满了的时候,数据库要么扩展控制文件为新的记录创建空间要么覆盖最旧的记录。初始化参数CONTROL_FILE_RECORD_KEEP_TIME指定记录在可以被重用之前的最短保留时间(以天为单位)。
    CONTROL_FILE_RECORD_KEEP_TIME = integer

    非循环重有的记录保留不经常更改和不能被覆盖的关键信息。非循环重用记录中的信息示例包含数据文件,在线redo日志文件和redo线程。

    当对目标数据库进行备份时,数据库记录这些备份在控制文件中。为了预防控制文件因为新记录的增加而增长得太大,如果它们比指定的阀值更旧,记录可以被重用。

    注:当记录被覆盖时,与元数据关联的备份片成为孤儿(orphaned),不被RMAN管理。

    当数据库必须增加新的RMAN仓库记录到控制文件但没有记录旧于阀值时,数据库尝试扩大控制文件的大小。如果底层的操作系统阻止控制文件的扩展(例如,由于磁盘已满),那么数据库覆盖控制文件中最旧的记录。

    数据库在自动诊断仓库中(Automatic Diagnostic Repository)的alert日志中记录覆盖情况。对于它覆盖的每个记录,数据库记录一个类似以下的条目在alert日志中:

    kccwnc: following control file record written over:
    RECID #72 Recno 72 Record timestamp
    07/28/06 22:15:21
    Thread=1 Seq#=3460
    Backup set key: stamp=372031415, count=17
    Low scn: 0x0000.3af33f36
    07/27/06 21:00:08
    Next scn: 0x0000.3af3871b
    07/27/06 23:23:54
    Resetlogs scn and time
    scn: 0x0000.00000001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.1.1.关于快速恢复区域和控制文件记录

    当包含关于在快速恢复区域中创建的文件的信息的控制文件记录准备被重用的时候,当文件符合删除条件时,数据库尝试从快速恢复区域中删除文件。否则,数据库扩大包含这个文件的记录的控制文件部分的大小。

    数据库在alert日志中使用如以下示例的信息记录扩展,其中nnnn是控制文件记录类型的编号:

    kccwnc: trying to expand control file section nnnn for Oracle Managed
    Files
    
    • 1
    • 2

    如果控制文件是主机操作系统支持的最大大小,那么数据库不能扩大控制文件。在这种情形中,以下告警出现在alert日志中:

    WARNING: Oracle Managed File filename is unknown to control file. This
    is the result of limitation in control file size that could not keep
    all recovery area files.
    
    • 1
    • 2
    • 3

    上面的信息意味着控制文件不能保留一个所有快速恢复区域文件的记录来满足配置的保留策略。


    2.2.预防控制文件记录的丢失

    预防由于覆盖控制文件记录而丢失RMAN元数据的最好方式是使用恢复目录(recovery catalog)。

    如果不能使用恢复目录,那么可以采取以下措施:
    1)设置CONTROL_FILE_RECORD_KEEP_TIME值比必须保留的最旧的文件稍长。例如,如果每周备份整个数据库一次,那么必须保留每个备份至少7天以上。设置CONTROL_FILE_RECORD_KEEP_TIME到一个值比如10或14。缺省的CONTROL_FIILE_RECORD_KEEP_TIME的值是7天。

    警告:不管是否使用恢复目录,当CONTROL_FILE_RECORD_KEEP_TIME设置为0时绝不能使用RMAN。如果使用,那么可能会丢失备份记录。

    2)存储控制文件在文件系统中而不是裸设备上,这样它可以扩展。

    3)监控alert日志来确保Oracle数据库不会覆盖控制文件记录。Alert日志位于自动诊断仓库(Automatic Diagnostic Repository,ADR)。

    如果使用恢复目录,那么遵循以下准则来避免控制文件不能保留所有快速恢复区域文件的记录来满足备份保留策略的情况:
    1) 如果控制文件的块大小不是最大值,那么使用更大的块大小,优先使用32KB。
    为了达到这个目标,必须设置SYSTEM表空间块大小大于或等于控制文件块大小和在更改DB_BLOCK_SIZE之后重建控制文件。在快速恢复区域中的文件会被重新登记,但在磁带上的文件的记录会丢失。

    2) 通过备份它们到第三方的存储比如磁带让快速恢复区域中的文件符合删除条件。
    例如,可以使用BACKUP RECOVERY AREA来指定备份快速恢复区域中的文件到介质管理器。

    3)如果备份保留策略保留备份和归档日志比企业要求更长,那么可以通过更改保留策略到一个更短的恢复窗口或更低的冗余度来使快速恢复区域中的更多文件符合删除条件。


    2.3.保护控制文件

    如果你没有正在使用恢复目录来存储RMAN元数据,那么保护每个目标数据库的控制文件是加倍重要的。

    可以使用以下策略来保护控制文件:
    1) 通过多路复用(multiplexing)或操作系统镜像来创建冗余的控制文件副本。
    在这种方式中,数据库可以忍受丢失控制文件的子集而不要求从备份中还原控制文件。Oracle建议在不同的磁盘上使用至少2个多路复用或镜像的控制文件。
    2) 配置控制文件自动备份特性。
    在这个情况中,当运行某些RMAN命令时,RMAN自动备份控制文件。如果控制文件自动备份是可用的,RMAN可以还原spfile和备份的控制文件和挂载数据库。在控制文件挂载之后,可以还原数据库的剩余部分。
    3) 保留数据库DBID的一个记录。
    如果丢失控制文件,那么可以使用DBID来恢复数据库。


    3.维护快速恢复区域

    虽然快速恢复区域主要是自我管理,某些情况可能要求数据库管理干预。

    3.1.快速恢复区域的删除规则

    RMAN使用某些规则来确定文件什么时候可以从快速恢复区域中删除。

    以下规则管理文件何时符合从恢复区域中删除的条件:
    1) 永久(permanent)文件从不符合删除的条件。
    2) 在保留策略规定下过期的文件符合删除的条件。
    3) 已经拷贝到磁带的临时文件符合删除的条件。
    4) 归档redo日志不符合删除条件直到已经满足所有的日志使用者的要求。
    日志使用者可以包括RMAN,备数据库和闪回数据库特性。
    5)逻辑备数据库上外来的归档日志在已经被LogMiner会话挖掘之后符合删除的条件。因为它是从与当前数据库不同的数据库上生成的,外来归档redo日志有与当前归档redo日志不同的DBID。

    控制从快速恢复区域中删除文件的安全和可靠的方式是配置保留策略和归档日志删除策略。为了增加已经移动到磁带的文件在磁盘上保留的可能性,可以增大快速恢复区域的配额。


    3.2.监控快速恢复区域使用

    可以使用视图V$RECOVERY_FILE_DESTV$RECOVERY_AREA_USAGE来确定是否已经为快速恢复区域分配了足够的空间。

    查询视图V$RECOVERY_FILE_DEST来发现快速恢复区域的当前位置,磁盘配额,在使用的空间,通过删除文件可以回收的空间和在快速恢复区域中的文件总数量。空间列指定的数量的单位为byte。
    SQL> SELECT * FROM V$RECOVERY_FILE_DEST;

    NAME       		SPACE_LIMIT 	SPACE_USED 		SPACE_RECLAIMABLE 	NUMBER_OF_FILES CON_ID
    ---------- 	   -----------	 	----------     ----------------- 	--------------- -----
    +RECO       	3.2212E+10 		2.5156E+10        8812232704             108          0
    
    • 1
    • 2
    • 3

    查询视图V$RECOVERY_AREA_USAGE来发现被不同文件类型使用的总磁盘配额的百分比。同时,可以确定通过删除过期的,冗余的,或已经备份到磁带的文件可以回收的每种文件类型的空间数量。
    SQL> SELECT * FROM V$RECOVERY_AREA_USAGE;

    FILE_TYPE       PERCENT_SPACE_USED  PERCENT_SPACE_RECLAIMABLE  NUMBER_OF_FILES  CON_ID
    ------------  ------------------- 	----------------------    ---------- -----
    CONTROL FILE              .07      	  		   0            	1          0
    REDO LOG                 5.23                   0   		   	8          0
    ARCHIVED LOG             32.37                 .22            	62         0
    BACKUP PIECE              17.5                 14.69           	14         0
    IMAGE COPY               10.49                10.49           	4          0
    FLASHBACK LOG            12.43                 1.96           	19         0
    FOREIGN ARCHIVED LOG       0                    0               0          0
    AUXILIARY DATAFILE COPY    0                    0               0          0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当在数据库上定义了保证还原点时,必须为需要用来满足保证的文件监控快速恢复区域中的空间使用情况。使用视图V$RESTORE_POINT查询来查看还原点和列STORAGE_SIZE来确认每个保证还原点相关的文件要求的空间。


    3.3.管理快速恢复区域中的闪回日志空间

    除了通过设置闪回保留目标或使用保证还原点以外,不能直接管理快速恢复区域中的闪回日志。

    然而,可以作为一个整体管理快速恢复区域空间来为闪回日志的保留最大化可用的空间。通过这种方式增加达到闪回目标的可能性。

    为了给闪回日志腾出空间,使用比如BACKUP RECOVERY AREA和BACKUP BACKUPSET等命令备份快速恢复区域中的其它内容到磁带。Oracle数据库自动从快速恢复区域中移除过期的文件。如果卸载备份到磁带依然不能创建足够的空间来满足备份保留策略和闪回保留目标,那么分配更多的空间到快速恢复区域。

    从Oracle数据库19c开始,简化了管理快速恢复区域中的空间。Oracle数据库监控快速恢复区域中的闪回日志和自动删除超过保留期限的闪回日志。当保留目标降低时,超过保留期限的闪回日志立即被删除。

    为了让闪回日志自动被删除,初始化参数COMPATIBLE必须设置为19.0.0或更高。

    在突发的负载高峰引起大量闪回日志被创建的场景中,在删除超过保留期限的闪回日志之前会监控负载几天。如果另外一个尖峰负载不久以后发生,这避免了重新创建闪回日志的消耗。

    注:不可以备份闪回日志。因此,当备份快速恢复区域的内容到磁带时,BACKUP RECOVERY AREA操作不包含闪回日志。


    3.4.响应满的快速恢复区域

    如果RMAN保留策略要求保留一组大于快速恢复区域配额的备份,或保留策略设置为NONE,那么快速恢复区域可以完全填满而没有可回收的空间。

    当可回收的空间少于15%时数据库发出一个警告(warning)alert,当可回收空间少于3%时数据库发出一个严重的(critical)alert。为了在这个情况中提醒DBA,增加一个条目到alert日志和DBA_OUTSTANDING_ALERTS表(由OEM使用)。然而,数据库继续消耗快速恢复区域中的空间直到没有可回收的空间剩余为止。

    当恢复区域完全满了的时候,显示的错误如下所示,nnnn是要求的字节数和mmmm是磁盘配额:

    ORA-19809: limit exceeded for recovery files
    ORA-19804: cannot reclaim nnnnn bytes disk space from mmmmm limit
    
    • 1
    • 2

    当没有文件符合删除的条件时,有几个可以用来解决满了的快速恢复区域的选择:
    1)让更多磁盘空间可用,增大DB_RECOVERY_FILE_DEST_SIZE来反映额外的空间。
    2)将备份从快速恢复区域移动到第三方存储比如磁带。
    一个方便的方法是使用命令BACKUP RECOVERY AREA一起备份所有恢复区域的文件到磁带。在从恢复区域传输备份到磁带以后,可以从快速恢复区域中删除文件。闪回日志不能备份到恢复区域以外的地方,因此不被BACKUP RECOVERY AREA命令备份。
    3)对已经被操作系统工具移除的任何文件运行DELETE命令。
    如果使用主机操作系统命令删除了文件,那么数据库没有意识到产生的空闲空间。可以运行RMAN命令CROSSCHECK让RMAN重新检查快速恢复区域的内容和鉴别过期的文件,然后使用DELETE EXPIRED命令来从RMAN仓库中删除每个失效的备份。
    4)确保保证还原点是必要的。如果不是,删除它们。
    保证还原点不需要的闪回日志会自动被删除来为快速恢复区域中的其它文件获取空间。保证还原点强制保留要求的闪回日志来执行闪回数据库到还原点SCN。
    5)回顾备份保留策略,如果正在使用Data Guard,审查归档redo日志删除策略。


    3.5.更改快速恢复区域到新的位置

    使用ALTER SYSTEM命令来更改快速恢复区域的位置。

    如果必须移动数据库的快速恢复区域到一个新的位置,那么遵循以下步骤:
    1)在目标数据库上启动SQLPlus,更改DB_RECOVERY_FILE_DEST初始化参数。例如,输入以下命令设置目标到ASM磁盘组:
    ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=‘+disk1’ SCOPE=BOTH SID='

    在更改这个参数之后,所有新的快速恢复区域文件在新的位置中创建。

    2)留下或移动在旧快速恢复位置的永久文件,闪回日志和临时文件。

    如果将文件遗留在旧快速恢复位置,那么当临时文件变成符合删除的条件时,数据库从旧快速恢复区域删除它们。

    如果必须移动旧文件到新的快速恢复区域,可以参考Oracle ASM管理指南。当移动文件到快速恢复区域或从快速恢复区域移出文件时,使用RMAN移动数据库文件到ASM磁盘组或从ASM磁盘组移出数据库文件的步骤也适用。


    3.6.响应在文件创建过程中的实例崩溃

    作为一个规则,快速恢复区域是自我管理的。当在快速恢复区域中的文件在创建过程中实例崩溃时,数据库可能遗留文件在快速恢复区域。

    当这个情况发生时,alert日志包含以下错误,location是快速恢复区域的位置:

    ORA-19816: WARNING: Files may exist in location that are not known to database.
    
    • 1

    在这样的情况中,使用RMAN命令CATALOG RECOVERY AREA来重新登记任何这些文件。如果有问题的文件的文件头部损坏了,那么使用操作系统工具手动删除它。


    4.更新RMAN仓库

    有几种情况可能造成RMAN仓库和它记录的文件之间不一致,包括磁带或磁盘故障,用户管理的拷贝或删除RMAN相关的文件等。

    这部分阐述如何确保RMAN仓库准确地反映存储在磁盘和磁带上的RMAN相关的文件的真实情况。


    4.1.交叉检查RMAN仓库

    为了确保在恢复目录或控制文件中关于备份的数据与磁盘上或介质管理目录中相应的数据同步,执行交叉检查。CROSSCHECK命令只操作当前记录在RMAN仓库中的文件。

    如果使用快速恢复区域,备份保留策略和归档redo日志删除策略,那么不需要经常执行交叉检查。如果通过RMAN以外的方式删除文件,那么必须定期执行交叉检查来确保仓库数据保持一致。


    4.1.1.关于RMAN交叉检查

    交叉检查更新过时的关于仓库记录与它们的物理状态不匹配的备份的RMAN仓库信息。例如,如果用户使用操作系统命令从磁盘中删除归档日志,仓库仍然标示日志在磁盘上,而实际上它们并不在。

    下图说明介质管理器的交叉检查。RMAN查询RMAN仓库获得要检查的4个备份集的名称和位置。RMAN发送这个信息到目标数据库服务器,它查询介质管理软件关于备份的信息。介质管理器检查它的介质目录和向服务器返回报告备份集3缺失。RMAN在仓库中更新备份集3的状态为EXPIRED。在运行DELETE EXPIRED之后,备份集3的记录被删除。

    在这里插入图片描述

    交叉检查是有很用的,因为它们可以做以下操作:
    1)更新过时的关于从磁盘或磁带消失或损坏的备份的信息
    2)如果使用操作系统命令删除归档redo日志或其它文件,更新仓库

    使用交叉检查特性来检查磁盘或磁带上的备份的状态。如果备份在磁盘上,那么CROSSCHECK交叉检查文件的头部是否有效。如果备份在磁带上,那么命令检查备份是否存在介质管理软件的目录中。

    备份片和映像副本可以有状态AVAILABLE,EXPIRED,或UNAVAILABLE。可以通过运行RMAN的LIST命令或查询视图V$BACKUP_FILES或恢复目标视图比如RC_DATAFILE_COPY和RC_ARCHIVED_LOG来查看备份的状态。交叉检查更新RMAN仓库以便所有这些技术提供准确的信息。如果备份不再可用,RMAN更新RMAN仓库中的每个备份的状态为EXPIRED。如果新的交叉检查确定一个过期的备份再次是可用的,那么RMAN更新它的状态为AVAILABLE。

    注:CROSSCHECK命令不会删除操作系统文件或移除仓库记录。必须使用DELETE命令来做这些操作。

    可以执行DELETE EXPIRED命令来删除所有失效的备份。RMAN从仓库中中移除失效的文件的记录。如果因为某些原因文件仍然在介质上存在,那么RMAN发出警告和列出不匹配的不能删除的对象。


    4.1.2.交叉检查所有备份和副本

    在连接到目标数据库和恢复目录(如果有使用的话)之后,运行CROSSCHECK命令来验证RMAN已知的备份的状态和可用性。

    可以在执行CROSSCHECK或DELETE命令之前配置或手工分配多个通道。RMAN在所有与用来创建备份的通道相同的设备类型的通道上搜索每个备份。多通道特性主要用于在一个命令中同时交叉检查或删除磁盘和磁带上的备份。例如,假设有一个SBT通道配置如下:
    CONFIGURE DEVICE TYPE sbt PARALLELISM 1;
    CONFIGURE DEFAULT DEVICE TYPE sbt;

    在这个情况中,可以运行以下命令来同时交叉磁盘和通道:
    CROSSCHECK BACKUP;
    CROSSCHECK COPY;

    RMAN同时使用SBT通道和预先配置的磁盘通道来执行交叉检查。

    allocated channel: ORA_SBT_TAPE_1
    channel ORA_SBT_TAPE_1: sid=12 devtype=SBT_TAPE
    channel ORA_SBT_TAPE_1: WARNING: Oracle Test Disk API
    using channel ORA_DISK_1
    crosschecked backup piece: found to be 'AVAILABLE'
    backup piece handle=/oracle/dbs/16c5esv4_1_1 recid=36 stamp=408384484
    crosschecked backup piece: found to be 'AVAILABLE'
    backup piece handle=/oracle/dbs/c-674966176-20000915-01 recid=37
    stamp=408384496
    crosschecked backup piece: found to be 'AVAILABLE'
    backup piece handle=12c5erb2_1_1 recid=32 stamp=408382820
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如果没有配置自动的SBT通道,那么可以手动在磁盘和磁带上分配维护通道:
    ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt;
    CROSSCHECK BACKUP;
    CROSSCHECK COPY;

    不需要手动分配磁盘通道,因为RMAN使用预配置的磁盘通道。


    4.1.3.交叉检查指定的备份集和副本

    可以使用LIST命令来报告备份,然后使用CROSSCHECK命令来检查在LIST输出中描述的指定的备份是否存在。

    DELETE EXPIRED命令删除交叉检查失败的备份的仓库记录。

    例如,运行以下命令:
    LIST BACKUP; # lists all backup sets, proxy copies, and imagecopies

    CROSSCHECK BACKUP; # checks backup sets, proxy copies, and imagecopies
    CROSSCHECK COPY OF DATABASE;
    CROSSCHECK BACKUPSET 1338, 1339, 1340;
    CROSSCHECK BACKUPPIECE TAG ‘nightly_backup’;
    CROSSCHECK BACKUP OF ARCHIVELOG ALL SPFILE;
    CROSSCHECK BACKUP OF DATAFILE “?/oradata/trgt/system01.dbf”
    COMPLETED AFTER ‘SYSDATE-14’;
    CROSSCHECK BACKUPSET DEVICE TYPE disk BACKED UP 3 TIMES TO sbt;
    CROSSCHECK BACKUP OF DATABASE BACKED UP 2 TIMES TO sbt;
    CROSSCHECK CONTROLFILECOPY ‘/tmp/control01.ctl’;
    CROSSCHECK DATAFILECOPY 113, 114, 115;
    CROSSCHECK PROXY 789;


    4.2.更改备份和副本的仓库状态

    RMAN提供多个方法来更改备份和副本的仓库状态。

    执行以下其中一个任务来更改更改备份和副本的仓库状态:
    1) 让备份可用或不可用。
    如果备份变成临时可用或不可用,可以更改它的状态。例如,如果挂载的磁盘在维护中,那么可以为磁盘上的备份更新记录为状态UNAVAILABLE。
    2) 从保留策略中包含或豁免备份。
    归档备份可以通过使用KEEP子语句从配置的保留策略中豁免备份。也可以更改归档备份的状态,随后包含它在配置的保留策略中。

    4.2.1.更新备份到状态可用或不可用

    当备份不能被找到或已经迁移到异地,运行CHANGE … UNAVAILABLE命令。

    RMAN不在RESTORE或RECOVER命令中使用状态是UNAVAILABLE的文件。如果文件稍后被找到或返回到主站点,可以通过命令CHANGE … AVAILABLE再次更新它的状态。在快速恢复区域中的文件不能标记为UNAVAILABLE。

    更新仓库中的文件状态为UNAVAILABLE或AVAILABLE:
    1) 执行LIST命令来确认RMAN备份的可用状态。例如,执行以下命令列出所有备份:
    LIST BACKUP;

    2) 使用CHANGE和UNAVAILABLE或AVAILABLE关键字更新RMAN仓库中备份的状态。
    CHANGE DATAFILECOPY ‘/tmp/control01.ctl’ UNAVAILABLE;
    CHANGE COPY OF ARCHIVELOG SEQUENCE BETWEEN 1000 AND 1012 UNAVAILABLE;
    CHANGE BACKUPSET 12 UNAVAILABLE;
    CHANGE BACKUP OF SPFILE TAG “TAG20120208T154556” UNAVAILABLE;
    CHANGE DATAFILECOPY ‘/tmp/system01.dbf’ AVAILABLE;
    CHANGE BACKUPSET 12 AVAILABLE;
    CHANGE BACKUP OF SPFILE TAG “TAG20120208T154556” AVAILABLE;


    4.2.2.更改归档备份的状态

    可以指定备份免除保留策略的约束。这个技术对于归档备份遵守商业需求是有用的。

    归档备份仍然是完全有效的备份,然而,可以正如任何其它RMAN备份一样还原。

    注:KEEP FOREVER子语句要求使用恢复目录,因为控制文件不能包含一组无限大的RMAN仓库数据。

    可以使用CHANGE命令来更改存在的备份的KEEP状态。例如,你可能决定不再想保留一个长期备份。BACKUP … KEEP可用的选项也同样对于CHANGE … KEEP可用。

    不能为存储在快速恢复区域中的备份集或文件设置KEEP属性。

    更改归档备份的KEEP状态:
    1)列出所有备份。
    LIST BACKUP;

    2)执行CHANGE … KEEP命令为备份定义一个不同的保留期限,或CHANGE … NOKEEP命令让保留策略应用到这个文件。
    以下示例允许备份集受备份保留策略约束。
    CHANGE BACKUPSET 231 NOKEEP;

    以下示例让一个数据文件副本免除保留策略约束180天:
    CHANGE DATAFILECOPY ‘/tmp/system01.dbf’ KEEP UNTIL TIME ‘SYSDATE+180’;


    4.3.增加备份记录到RMAN仓库

    可以使用CATALOG命令让RMAN意识到没有记录在仓库中的归档日志或通过RMAN以外的方式创建的数据文件副本的存在。


    4.3.1.关于登记操作

    目标数据库控制文件保持所有由目标数据库生成的归档redo日志和所有RMAN备份的记录。CATALOG命令的目的是当它没有RMAN要管理的文件的记录时增加元数据到仓库。

    当发生以下情况时,运行RMAN的CATALOG命令:
    1) 使用操作系统工具制作数据文件的副本,归档日志或备份片。在这种情况中,仓库没有它们的记录。
    2) 使用备份的控制文件执行恢复,在恢复过程中更改了归档目的地或格式。在这种情况中,仓库没有关于需要用来恢复的归档日志的信息,必须登记这些日志。
    3) 你想登记数据文件副本作为级别0的备份,因此让你以后可以通过使用数据文件副本作为增量备份策略的基础执行增量备份。
    4) 你想登记用户管理的在迁移到更高版本之前创建的Oracle 7数据库文件或在开始使用RMAN之前创建的Oracle 8和更高版本的数据库文件的副本。如果在迁移后但在有机会备份迁移数据库之前出现故障,这些数据文件副本让你可以恢复数据库。

    无论何时你制作了一个用户管理的副本,例如,通过使用UNIX cp命令拷贝一个数据文件,确保登记它。当制作用户管理的副本时,可以使用ALTER TABLESPACE … BEGIN/END BACKUP语句来做在线的表空间的数据文件的副本。虽然RMAN不创建这些数据文件副本,可以使用CATALOG命令来增加它们到恢复目录以便RMAN知道它们。

    为了登记用户管理的副本,它必须是:
    1) 在磁盘上可访问的
    2) 一个单一的文件的完整映像副本
    3) 数据文件副本,控制文件副本,归档redo日志副本或备份片副本

    例如,可以存储数据文件在镜像的磁盘驱动器上,然后通过拆开镜像创建用户管理的副本。在这个场景中,在拆开镜像后使用CATALOG命令通知RMAN用户管理的副本的存在。在重新镜像前,运行CHANGE … UNCATALOG命令通知RMAN文件副本不再存在。


    4.3.2.登记用户管理的数据文件副本

    使用CATALOG命令传播关于用户管理的副本的信息到RMAN仓库。在文件被登记后,可以运行LIST命令或查询视图V$BACKUP_FILES来确认信息包含在RMAN仓库中。

    创建和登记用户管理的数据文件副本:
    1)使用操作系统工具制作数据文件副本。当备份在进行时如果数据库是打开状态和数据文件是在线的,执行ALTER TABLESPACE BEGIN/END BACKUP命令是必要的。以下示例备份在线数据文件,使用SQL*Plus HOST命令来发出操作系统命令。
    SQL> ALTER TABLESPACE users BEGIN BACKUP;
    SQL> HOST CP $ORACLE_HOME/oradata/trgt/users01.dbf /tmp/users01.dbf;
    SQL> ALTER TABLESPACE users END BACKUP;

    2)启动RMAN,连接到目标数据库和恢复目录(如果使用的话)。

    3)运行CATALOG命令。
    例如,执行以下命令登记用户管理的数据文件副本:
    CATALOG DATAFILECOPY ‘/tmp/users01.dbf’;

    如果尝试登记来自不同于连接的目标数据库的数据库的数据文件副本,那么RMAN报错:

    RMAN-00571:===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS===============
    RMAN-00571:===========================================================
    RMAN-03009: failure of catalog command on default channel at 08/29/2013 14:44:34
    ORA-19563: datafile copy header validation failed for file /tmp/tools01.dbf
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.3.3.登记备份片

    可以登记在磁盘上的备份片。如果使用操作系统工具从一个位置拷贝备份片到相同主机的另一个位置或从一台主机到另外一台主机,可以使用这个技术。

    甚至可以登记一个来自先前的数据库转生(incarnation)备份片。RMAN可以在随后的还原和恢复操作中决定备份片是否可以使用。

    登记备份片:
    1)启动RMAN,连接到目标数据库和恢复目录(如果有使用的话)。

    2)登记备份片的文件名称。
    CATALOG BACKUPPIECE ‘/disk2/09dtq55d_1_2’, ‘/disk2/0bdtqdou_1_1’;

    3)可选地,运行LIST命令或查询视图来验证更改。

    视图包括V$BACKUP_PIECE,V$BACKUP_SET,V$BACKUP_DATAFILE,V$BACKUP_REDOLOG和V$BACKUP_SPFILE。以下查询显示备份片的文件名称:
    SELECT HANDLEFROM V$BACKUP_PIECE;


    4.3.4.登记磁盘位置的所有文件

    如果使用ASM,OMF结构或快速恢复区域,那么你可能想重新登记磁盘管理系统已知但没有列在RMAN仓库的文件。当跟踪文件名称的预期机制由于介质故障,软件bug或用户错误失败时,这个情况可能发生。

    命令CATALOG START WITH让你搜遍在ASM磁盘组,OMF位置或传统的文件系统目录中的所有文件,调查那些没有记录在RMAN仓库中的文件。如果命令可以登记一个文件,那么它会这么做。如果它不能登记文件,那么它会对跳过的文件的内容做最好的猜测。

    命令CATALOG RECOVERY AREA让你登记恢复区域中的所有文件。一般来说,不需要手动运行这个命令,因为RMAN在需要的时候自动运行它,例如,当还原或创建一个控制文件时。当文件通过操作系统工具被拷贝到快速恢复区域时,可以运行这个命令。

    登记磁盘位置中的所有文件:
    1)启动RMAN,连接到目标数据库和恢复目录(如果有使用的话)。

    2)运行CATALOG命令,指定你想登记的文件的磁盘位置。
    CATALOG START WITH ‘+disk’; # catalog all files from an ASM diskgroup
    CATALOG START WITH ‘/fs1/datafiles/’; # catalog all files indirectory

    注:通配符在START WITH子语句中是非法的。

    可以使用CATALOG RECOVERY AREA命令来登记恢复区域中的所有文件。在这个操作过程中,在恢复区域里没有列在RMAN仓库中的任何文件都会被登记。
    CATALOG RECOVERY AREA;

    3)运行LIST命令验证文件已经被登记。


    4.4.从RMAN仓库删除记录

    4.4.1.关于RMAN仓库中的取消登记操作

    运行CHANGE … UNCATALOG命令在RMAN仓库记录上执行以下行为:
    1) 更新在控制文件仓库中的备份记录到状态DELETED
    2) 从恢复目录(如果有使用)删除特定的备份记录

    RMAN不会更改指定的物理文件:它只为这些文件更改仓库记录。

    当已经通过RMAN之外的方式删除备份时,可以使用这个命令。例如,如果使用操作系统工具删除归档redo日志,那么通过执行CHANGE ARCHIVELOG … UNCATALOG命令从仓库中移除日志的记录。


    4.4.2.为使用操作系统工具删除的文件删除记录

    可以使用CHANGE … UNCATALOG命令为不存在的文件更新RMAN仓库。

    在某些环境中,用户可能已经通过操作系统工具移除备份或归档redo日志。除非运行CROSSCHECK,RMAN不知道关于删除的信息。在这种情况中,可以使用CHANGE … UNCATALOG命令。

    移除备份或归档redo日志的catalog记录:
    1)为已经使用命令从操作系统中删除的备份运行CHANGE … UNCATALOG命令。以下示例删除涉及到控制文件和数据文件1的磁盘副本的仓库记录:
    CHANGE CONTROLFILECOPY ‘/tmp/control01.ctl’ UNCATALOG;
    CHANGE DATAFILECOPY ‘/tmp/system01.dbf’ UNCATALOG;
    CHANGE BACKUPSET ‘/disk1/oradata/backups/db1_full.bkp’ UNCATALOG;

    2)可选地,查看相关的恢复目录视图,例如,RC_DATAFILE_COPY或RC_CONTROLFILE_COPY来确认指定的记录已经被移除。以下查询确认副本4833的记录已经被移除:
    SELECT CDF_KEY, STATUSFROM RC_DATAFILE_COPYWHERE CDF_KEY = 4833;

    CDF_KEY STATUS
    ---------- ------
    0 rows selected.
    
    • 1
    • 2
    • 3

    5.删除RMAN备份和归档redo日志

    可以使用RMAN的DELETE命令来删除归档redo日志和RMAN备份。

    对于在磁盘上的备份,删除备份会从磁盘上物理移除备份文件。对于在SBT设备上的备份,RMAN的DELETE命令通知介质管理器删除磁带上的备份片或代理副本。在任何一种情况中,RMAN都会更新RMAN仓库来反映删除的情况。


    5.1.删除RMAN备份概览

    每个RMAN备份在RMAN仓库中产生一个相应的记录。这个记录存储在控制文件里。如果使用了恢复目录,那么记录在恢复目录与控制文件重新同步之后也可以在恢复目录中找到。

    例如,如果生成一个完全数据库备份集,那么可以在V$BACKUP_SET视图中查看这个备份集的记录。如果使用了恢复目录,也可以在目录视图RC_BACKUP_SET中访问记录。

    控制文件视图V$和恢复目录视图在存储信息的方式上不同,这影响到RMAN如何处理仓库记录。恢复目录的RMAN仓库存储在实际的数据库表中,而控制文件版本的仓库存储在控制文件的内部结构中。

    当使用RMAN命令删除备份或归档redo日志文件,RMAN做以下操作:
    1)从操作系统中移除物理文件(如果文件仍然存在)
    2)更新在控制文件中的文件记录到状态DELETED
    3)从恢复目录表中移除文件记录(如果RMAN连接到恢复目录)

    因为控制文件数据存储的方式,RMAN不能从控制文件中移除记录,只更新它到DELETED状态。因为恢复目录表是普通的数据库表,RMAN像从任何表中删除行一样从表中删除行。


    5.1.1.关于RMAN删除命令

    可以为备份删除备份和恢复目录记录。

    下表描述了可以删除备份的RMAN命令。

    命令目的
    DELETE删除备份,更新控制文件记录到状态DELETED,从恢复目录(如果使用了的话)中移除它们的记录。可以指定DELETE移除EXPIRED或OBSOLETE。如果在一个存在的备份上运行DELETE EXPIRED,那么RMAN发出警告,不删除备份。如果使用DELETE命令和可选的FORCE关键字,那么RMAN删除指定的备份,但忽略任何I/O错误,包括那些备份在磁盘或磁带上缺失的情况。它然后更新RMAN库来反映备份已经被删除的事实,不管RMAN是否能够删除文件或文件是否缺失。RMAN使用所有配置的通道来执行删除。如果为在没有配置自动通道的设备上的文件使用DELETE,必须首先使用ALLOCATE CHANNEL FOR MAINTENANCE命令。例如,如果使用SBT通道做备份,但只配置了磁盘通道,那么必须手工为DELETE分配SBT通道。当只对磁盘上的文件使用DELETE命令时,需要一个自动或手工分配的维护通道。
    BACKUP … DELETE [ALL] INPUT备份归档日志,数据文件副本或备份集,然后在备份成功完成后从操作系统中删除文件。RMAN也为删除的输入文件删除和更新仓库记录。如果指定DELETE INPUT(不使用ALL),那么RMAN只删除它备份的指定的文件。如果指定ALL INPUT,那么RMAN删除记录在RMAN仓库中的文件的所有副本。
    CHANGE … UNCATALOG为指定的备份删除恢复目录记录和更改控制文件记录到状态DELETED。CHANGE … UNCATALOG命令只更改备份的RMAN仓库记录,不会实际删除备份

    一个对象的RMAN仓库记录有时会不能反映对象的物理状态。例如,如果备份归档redo日志到磁盘,然后使用操作系统工具删除它。如果运行DELETE而不首先运行CROSSCHECK,那么记录错误地将日志列出为AVAILABLE。

    如果交互运行RMAN,那么RMAN在删除任何文件前询问确认信息。可以使用NOPROMPT关键字来抑制这些信息:
    DELETE NOPROMPT ARCHIVELOG ALL;


    5.1.2.关于归档redo日志删除

    建议的维护策略是配置快速恢复区域,备份保留策略和归档redo日志删除策略。

    缺省情况下,归档redo日志删除策略配置为NONE。在这种情况中,如果日志已经备份至少1次到磁盘或磁带或根据备份保留策略日志是过期的,快速恢复区域将日志视为符合删除的条件。

    归档redo日志可以通过数据库自动被删除或通过任何用户发起的列在“RMAN删除命令”中的RMAN命令删除。对于在恢复区域中的日志,数据库尽可能长地保留它们和当磁盘空间需要时自动删除符合条件的日志。可以使用BACKUP … DELETE INPUT或DELETE ARCHIVELOG从任何位置删除符合条件的日志,无论日志位于或在恢复区域之外。当日志删除策略是除了NONE之外的设置时,这两个命令都遵守归档redo日志删除策略。可以通过在DELETE命令中使用FORCE选项覆盖归档redo日志删除策略


    5.2.删除所有备份和副本

    使用RMAN的DELETE命令删除备份和映像副本。

    在某些环境中,你可能需要删除与数据库相关的所有备份集,代理副本和映像副本。例如,你不再需要一个数据库和想从系统中移除所有相关的文件。映像副本是一个使用BACKUP AS COPY命令生成的文件,由数据库归档的日志,或CATALOG命令登记的文件。

    删除所有备份和副本:
    1) 启动RMAN,连接到目标数据库和恢复目录(如果使用的话)。

    2) 如有必要,为包含要删除的备份的设备分配维护通道。
    如上表所述,RMAN使用所有配置的通道来执行删除。如果配置了通道,那么不需要手动分配维护通道。如果为在没有配置自动通道的设备上的文件使用DELETE,必须首先使用ALLOCATE CHANNEL FOR MAINTENANCE命令。

    3) 交叉检查备份和副本来确保逻辑记录与物理介质同步。
    CROSSCHECK BACKUP;
    CROSSCHECK COPY;

    4) 删除备份和副本。
    DELETE BACKUP;
    DELETE COPY;

    如果配置了磁盘和磁带通道,那么RMAN删除时同时使用配置的SBT通道和预配置的磁盘通道。RMAN在删除任何文件前提示你确认。


    5.3.删除指定的备份和副本

    可以同时使用DELETE和BACKUP … DELETE命令删除指定的备份和副本。

    命令BACKUP … DELETE首先备份文件,通常到磁带,之后删除输入文件。

    DELETE命令支持大范围的选项来确认要删除的对象。当删除归档redo日志时,RMAN使用配置的设置来决定日志是否可以被删除

    删除指定的备份和副本:
    1) 启动RMAN,连接到目标数据库和恢复目录(如果使用的话)。

    2) 如有必要,为包含要删除的备份的设备分配维护通道。
    如上表所述,RMAN使用所有配置的通道来执行删除。如果配置了通道,那么不需要手动分配维护通道。如果为在没有配置自动通道的设备上的文件使用DELETE,必须首先使用ALLOCATE CHANNEL FOR MAINTENANCE命令。

    3) 删除指定的备份和副本。
    以下示例显示DELETE命令的多种常用方法指定要删除的备份和归档日志。
    a. 使用LIST输出的主键来删除备份:
    DELETE BACKUPPIECE 101;

    b. 通过磁盘上的文件名来删除备份:
    DELETE CONTROLFILECOPY ‘/tmp/control01.ctl’;

    c. 删除归档redo日志:
    DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE 300;

    d. 删除基于标签的备份:
    DELETE BACKUP TAG ‘before_upgrade’;

    e. 删除基于备份的对象的备份和备份存储的介质或磁盘位置:
    DELETE BACKUP OF TABLESPACE users DEVICE TYPE sbt; #delete only from tape
    DELETE COPY OF CONTROLFILE LIKE ‘/tmp/%’;

    f. 基于是否已经备份到磁带从磁盘删除归档redo日志:
    DELETE ARCHIVELOG ALL
    BACKED UP 3 TIMES TO sbt;

    g. 删除已经备份两次到磁带的备份集:
    DELETE BACKUPSET DEVICE TYPE disk BACKED UP 2 TIMES TO sbt;

    h. 删除目标数据库已经备份1次到磁带的备份:
    DELETE BACKUP OF DATABASE DEVICE TYPE disk BACKED UP 1 TIMES TO sbt;


    5.3.1.使用BACKUP … DELETE 删除指定的文件

    可以使用BACKUP … DELETE来备份归档redo日志,数据文件副本或备份集,然后在成功备份它们后删除输入的文件。

    指定DELETE INPUT选项等同于对输入文件执行DELETE命令。RMAN使用配置的设置来决定归档redo日志是否可以被删除。在DELETE ALL INPUT子语句中的选项ALL只应用到归档redo日志。如果运行BACKUP … DELETE ALL INPUT,那么命令删除相应的归档redo日志的所有副本或匹配BACKUP命令中的选择条件的数据文件副本。


    5.4.删除失效的备份和副本

    如果运行CROSSCHECK,RMAN不能定位到文件,那么它在RMAN仓库中更新文件的记录为状态EXPIRED。可以使用DELETE EXPIRED命令从RMAN仓库中移除失效的备份和副本的记录。

    如果任何标记为EXPIRED的文件实际上存在的话,DELETE EXPIRED命令发出警告。在极少的情况下,仓库会在文件存在的时候标记文件为EXPIRED。例如,包含文件的目录在交叉检查的时候损坏但稍后修复了,或当文件实际存在的时候介质管理器没有进行恰当的配置和报告某些备份为不存在。

    删除失效的仓库记录:
    1) 如果最近没有进行交叉检查,那么执行CROSSCHECK命令。
    CROSSCHECK BACKUP;

    2) 删除失效的备份。
    DELETE EXPIRED BACKUP;


    5.5.基于保留策略删除过期的备份

    RMAN的DELETE命令支持OBSOLETE选项,它删除不再需要用来满足指定的可恢复性要求的备份。

    可以根据配置的缺省的保留策略或在DELETE OBSOLETE命令中作为选项指定的其它的保留策略删除过期的文件。如同其它格式的DELETE命令一样,要删除的文件从备份介质中移除,从恢复目录中删除记录和在控制文件中被标记为DELETED。

    可以指定不带参数的DELETE OBSOLETE命令,RMAN删除由配置的保留策略定义的所有过期备份。
    DELETE OBSOLETE;


    5.5.1.当KEEP UNTIL TIME过期时DELETE OBSOLETE行为

    如果归档备份的KEEP UNTIL TIME期限没有过期,RMAN不会将备份视为过期的。只要KEEP UNTILE期限过期,备份被立即视为过期的,不管任何配置的备份保留策略。因此,如果KEEP时间已经过期,DELETE OBSOLETE删除任何使用BACKUP … KEEP UNTIL TIME创建的备份。


    6.删除数据库

    可以在RMAN中使用DROP DATABASE命令来从操作系统中删除数据库。RMAN删除属于目标数据库的spfile,所有数据文件,在线redo日志和控制文件。

    DROP DATABASE要求RMAN连接到目标数据库和目标数据库被挂载。命令不要求连接到恢复目录。如果RMAN连接到恢复目录和指定了选项INCLUDE COPIES AND BACKUPS,那么RMAN也取消注册数据库。

    删除数据库:
    1)启动RMAN,连接到目标数据库和恢复目录(如果使用的话)。

    2)登记所有与数据库关联的备份。例如,以下命令登记快速恢复区域中的文件,然后登记第二个归档目标:
    CATALOG START WITH ‘+disk1’; # all files from recovery area on ASM disk
    CATALOG START WITH ‘/arch_dest2’; # all files from second archiving location

    3)删除与数据库关联的所有备份和副本。
    DELETE BACKUPSET; # deletes all backups
    DELETE COPY; # deletes all image copies (including archived logs)

    4)从操作系统中删除数据库。
    以下命令删除数据库和从恢复目录(如果有使用)自动取消注册。RMAN提示确认信息。
    alter system enable restricted session; #让数据库进入受限模式
    DROP DATABASE;



    来源:《Oracle Database Backup and Recovery User’s Guide,19c》

  • 相关阅读:
    魔众API支持接口数量配额邮件告警
    Oracle监听服务启动后停止
    9、ajax和json
    纯代谢冲上Nature不是幻想,蛋氨酸饮食可影响小鼠癌症预后,同样可影响人体代谢
    C++中的继承
    晚饭都没吃,我一前端帮后端做了一点SQL优化,才避免了通宵
    轻松玩转树莓派Pico之四、Ubuntu下在线debug环境搭建
    浅谈事件冒泡前世今生
    计算C语言字符串长度的方法与区别
    OpenCV实现求解单目相机位姿
  • 原文地址:https://blog.csdn.net/jetliu05/article/details/128151950