项目中需要使用Oracle的增量同步功能,需要打开Oracle的CDC开关,同时涉及到了相应日志的优化工作。
1. 打开归档日志开关(启动LogMiner)
a. 使用有DBA权限的用户登录Oracle
b. 检查数据库日志模式
SQL> select log_mode from v$database;
如果结果是ARCHIVELOG,可以转至步骤2。
如果结果是NOARCHIVELOG,执行下面SQL命令
SQL> shutdown immediate; # Shut down the database
SQL> startup mount; # Start up and mount the database
SQL> alter database archivelog; # enable archiving
SQL> alter database open; # open the database
查看存储路径
select dest_id,name from v$archived_log;
2. 启用 Supplemental Logging
为了从日志里获取数据,LogMiner需要启用数据库或表的supplemental logging。Supplemental logging又分为identification key logging和full supplemental logging。Identification key logging只包含主键和发生改变的字段数据,而full supplemental logging包含了所有字段的数据,这两种根据需求选择一种即可。
启用Identification key logging
可以指定一张表启用
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
也可以同时为数据库中所有表启用
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
启用full supplemental logging
指定一张表启用
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
为数据库中所有表启用
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
提交修改
ALTER SYSTEM SWITCH LOGFILE;
创建用户
在CDC Client源中需要配置账户信息连接Oracle,要求该用户有一定权限,所以这里新建一个用户。
CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, execute_catalog_role, select any transaction, select any table to <user name>;
GRANT select on GV_$DATABASE to <user name>;
GRANT select on GV_$ARCHIVED_LOG to <user name>;
GRANT select on V_$LOGMNR_CONTENTS to <user name>;
GRANT select on <db>.<table> TO <user name>;
用户通过使用V$ARCHIVE_DEST和$ARCHIVE_LOG视图获取归档日志信息。
V$ARCHIVE_DEST:显示当前所有归档日志存储位置及其状态。
V$ARCHIVE_LOG:显示历史归档日志信息。
创建SDC_TEST用户,密码为666666。注意,这里同样需要使用具有DBA权限的用户操作。
SQL> create user SDC_TEST identified by 666666;
SQL> grant create session, alter session, execute_catalog_role, select any transaction, select any table to SDC_TEST;
SQL> grant select on GV_$DATABASE to SDC_TEST;
SQL> grant select on GV_$ARCHIVED_LOG to SDC_TEST;
SQL> grant select on V_$LOGMNR_CONTENTS to SDC_TEST;
4. 提取LogMiner Dictionary到redo log
当你希望LogMiner使用来自redo log中的字典时,需要执行此步骤,将字典提取到redo log中,且必须在启动pipeline之前执行。如果使用online catlog中的字典,则不需要。
EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
5.日常维护
优化一(切换到更大的磁盘):
以dba角色登录: conn / as sysdba
如果挂载有更大的磁盘,可以修改日志目录
alter system set log_archive_dest_1='location=E:\archivelog' scope=spfile;
alter system set log_archive_start=TRUE scope=spfile;
优化二(定时删除过期日志文件,否则会导致数据库无法使用):
新建定时任务执行脚本
#clear_arc.bat
@echo off
@echo start
rman target / nocatalog cmdfile clear.rcv
#clear.rcv
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
问题一:
遇到了用户大量更新操作时,导致archivelog空间使用率是否过高,无法连接Oracle。
报错ORA-00257: archiver error. Connect internal only, until freed。
1.调整日志目录大小限制:
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE; --查看磁盘占用情况,ARCHIVED LOG空间使用率是否过高
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 16.34 0 59
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
FOREIGN ARCHIVED LOG 0 0 0
已选择7行。
SQL> show parameter recover; --查看文件存储路径
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\app\Administrator\flash_recovery_area
db_recovery_file_dest_size big integer 5G
recovery_parallelism integer 0
SQL> show parameter db_recovery_file_dest_size; --查看日志文件占用的(总)空间大小
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size big integer 5G
SQL> alter system set db_recovery_file_dest_size=10G scope=spfile; --修改日志文件占用的(总)空间大小
系统已更改。
SQL> shutdown immediate --重启数据库生效配置
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
数据库装载完毕。
数据库已经打开。
SQL> show parameter db_recovery_file_dest_size; --查看日志文件占用的(总)空间大小
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size big integer 10G
2.删除过期日志
$ rman --清空归档日志方式
RAM> connect target /
RAM> crosscheck archivelog all; --查看所有的归档文件
-- 清空策略一
-- 如何确认归档日志是否过期,rman有一个保留策略,可以定义多少天之前的日志算为过期;
RAM> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; --让恢复窗口成为7天大小。
RAM> delete expired archivelog all; --清空过期的归档文件
-- 清空策略二
RAM> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; --或者直接使用删除命令,清楚7天前数据。
RAM> show all; --查看所有的rman策略.
SQL> select count(*) from v$archived_log where archived='YES' and deleted='NO'; --查看所有归档,未删除的归档日志