1.归档日志设置
# 切换账号
$ su - oracle
# 登录oracle的sys账户
$ sqlplus / as sysdba
sql> archive log list; #查看是不是归档方式
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 367
Next log sequence to archive 369
Current log sequence
# 注:其中Archive Mode表示是归档方式,可以不用进行以下操作
sql> alter system set log_archive_start=true scope=spfile; #启用主动归档
sql> shutdown immediate;
sql> startup mount; #打开控制文件,不打开数据文件
sql> alter database archivelog; #将数据库切换为归档模式
sql> alter database open; #将数据文件打开
sql> archive log list; #查看此时是否处于归档模式
#查询以确定数据库位于archivelog模式中且归档过程正在运行
sql> select log_mode from v$database;
sql> select archiver from v$instance;
#日志切换
sql> alter system switch logfile;
#在oracle情况中运行如下查询:
sql> select name from v$archived_log;
2.设置非归档模式
sql> archive log list; #查看是否是归档方式
sql> alter system set log_archive_start=false scope=spfile; #禁用自动归档
sql> shutdown immediate;
sql> startup mount; #打开控制文件,不打开数据文件
sql> alter database noarchivelog; #将数据库切换为非归档模式
sql> alter database open; #将数据文件打开
sql> archive log list; #查看此时便处于非归档模式
3.阿里云设置oracle实时同步时,oracle的准备
查看数据库是否支持
# 查看数据库版本
sql> select * from v$version;
#可以看到版本是c12
sql> select version from v$instance;
# 查看数据库不是cdb类型(datawork不支持db)
sql> select name,cdb,open_mode,con_id from v$database;
创建同步账号,并赋予相应权限
# 创建oracle同步账号
sql> CREATE USER username IDENTIFIED BY password;
# 创建test账号
sql> CREATE USER test IDENTIFIED BY test123;
#给同步账户设置相应权限
grant create session to '同步账号'; //授权同步账号登录数据库。
grant connect to '同步账号'; //授权同步账号连接数据库。
grant select on nls_database_parameters to '同步账号'; //授权同步账号查询数据库的nls_database_parameters系统配置。
grant select on all_users to '同步账号'; //授权同步账号查询数据库中的所有用户。
grant select on all_objects to '同步账号'; //授权同步账号查询数据库中的所有对象。
grant select on DBA_MVIEWS to '同步账号'; //授权同步账号查看数据库的物化视图。
grant select on DBA_MVIEW_LOGS to '同步账号'; //授权同步账号查看数据库的物化视图日志。
grant select on DBA_CONSTRAINTS to '同步账号'; //授权同步账号查看数据库所有表的约束信息。
grant select on DBA_CONS_COLUMNS to '同步账号'; //授权同步账号查看数据库中所有表指定约束中所有列的相关信息。
grant select on all_tab_cols to '同步账号'; //授权同步账号查看数据库中表、视图和集群中列的相关信息。
grant select on sys.obj$ to '同步账号'; //授权同步账号查看数据库中的对象。sys.obj$表是Oracle字典表中的对象基础表,存放Oracle的所有对象。
grant select on SYS.COL$ to '同步账号'; //授权同步账号查看数据库表中列的定义信息。SYS.COL$用于保存表中列的定义信息。
grant select on sys.USER$ to '同步账号'; //授权同步账号查看数据库的系统表。sys.USER$是用户会话的默认服务。
grant select on sys.cdef$ to '同步账号'; //授权同步账号查看数据库的系统表。
grant select on sys.con$ to '同步账号'; //授权同步账号查看数据库的约束信息。sys.con$记录了Oracle的相关约束信息。
grant select on all_indexes to '同步账号'; //授权同步账号查看数据库的所有索引。
grant select on v_$database to '同步账号'; //授权同步账号查看数据库的v_$database视图。
grant select on V_$ARCHIVE_DEST to '同步账号'; //授权同步账号查看数据库的V_$ARCHIVE_DEST视图。
grant select on v_$log to '同步账号'; //授权同步账号查看数据库的v_$log视图。v_$log用于显示控制文件中的日志文件信息。
grant select on v_$logfile to '同步账号'; //授权同步账号查看数据库的v_$logfile视图。v_$logfile包含有关Redo日志文件的信息。
grant select on v_$archived_log to '同步账号'; //授权同步账号查看数据库的v$archived_log视图。v$archived_log包含有关归档日志的相关信息。
grant select on V_$LOGMNR_CONTENTS to '同步账号'; //授权同步账号查看数据库的V_$LOGMNR_CONTENTS视图。
grant select on DUAL to '同步账号'; //授权同步账号查看数据库的DUAL表。DUAL是用来构成select语法规则的虚拟表,Oracle的中DUAL中仅保留一条记录。
grant select on v_$parameter to '同步账号'; //授权同步账号查看数据库的v_$parameter视图。v$parameter是Oracle的动态字典表,保存了数据库参数的设置值。
grant select any transaction to '同步账号'; //授权同步账号查看数据库的任意事务。
grant execute on SYS.DBMS_LOGMNR to '同步账号'; //授权同步账号使用数据库的Logmnr工具。Logmnr工具可以帮助您分析事务,并找回丢失的数据。
grant alter session to '同步账号'; //授权同步账号修改数据库的连接。
grant select on dba_objects to '同步账号'; //授权同步账号查看数据库的所有对象。
grant select on v_$standby_log to '同步账号'; //授权同步账号查看数据库的v_$standby_log视图。v_$standby_log包含备用库的归档日志。
grant select on v_$ARCHIVE_GAP to '同步账号'; //授权同步账号查询缺失的归档日志。
# 赋予相应权限,以test为例
grant create session to test;
grant connect to test;
grant select on nls_database_parameters to test;
grant select on all_users to test;
grant select on all_objects to test;
grant select on DBA_MVIEWS to test;
grant select on DBA_MVIEW_LOGS to test;
grant select on DBA_CONSTRAINTS to test;
grant select on DBA_CONS_COLUMNS to test;
grant select on all_tab_cols to test;
grant select on sys.obj$ to test;
grant select on SYS.COL$ to test;
grant select on sys.USER$ to test;
grant select on sys.cdef$ to test;
grant select on sys.con$ to test;
grant select on all_indexes to test;
grant select on v_$database to test;
grant select on V_$ARCHIVE_DEST to test;
grant select on v_$log to test;
grant select on v_$logfile to test;
grant select on v_$archived_log to test;
grant select on V_$LOGMNR_CONTENTS to test;
grant select on DUAL to test;
grant select on v_$parameter to test;
grant select any transaction to test;
grant execute on SYS.DBMS_LOGMNR to test;
grant alter session to test;
grant select on dba_objects to test;
grant select on v_$standby_log to test;
grant select on v_$ARCHIVE_GAP to test;
grant LOGMINING TO test;
# 如果您涉及使用离线全量同步数据,还需要执行如下命令,授权同步账号所有表的查询权限。
sql> grant select any table to '同步账号';
# Oracle 12c及之后的版本需要执行如下命令,授权同步账号可以进行日志挖掘。Oracle 12c之前的版本,内置日志挖掘功能,无需执行该命令。
sql> grant LOGMINING TO '同步账号';
开启补充日志
您可以根据需要选择开启合适的补充日志,SQL语句如下。
sql> alter database add supplemental log data(primary key) columns; //为数据库的主键列开启补充日志。
sql> alter database add supplemental log data(unique) columns; //为数据库的唯一索引列开启补充日志。
切换Redo日志文件
开启补充日志后,您需要多次(一般建议执行5次)执行如下命令,切换Redo日志文件。
sql> alter system switch logfile;
查看数据库的字符编码
sql> select * from v$nls_parameters where PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
数据集成同步数据时,仅支持UTF8、AL32UTF8、AL16UTF16及ZHS16GBK编码格式。如果数据库中包含不支持的字符编码,请进行修改后再执行数据同步。
检查数据库表的数据类型
您可以使用查看表的SQL相关语句(SELECT)查询数据库表的数据类型。示例查看'tablename'表数据类型的语句如下。
sql> select COLUMN_NAME,DATA_TYPE from all_tab_columns where TABLE_NAME='tablename';
或
sql> desc tablename;
核对数据类型是否被datawork支持(参考:https://help.aliyun.com/zh/dataworks/user-guide/oracle-data-source?spm=a2c4g.11186623.0.i52)
4.日志爆满问题处理及设置日志自动清理脚本
情况一:账户可以登录时
# 进入RMAN
sql> rman target /
# 查看备份参数
RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name S4ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1;
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/12c/dbs/snapcf_s4orcl.f'; # default
# 查看存储日志
RMAN> crosscheck archivelog all;
# 验证并删除过期归档日志
RMAN> delete noprompt expired archivelog all;
# 验证并删除过期归档日志,方式二
RMAN> delete noprompt archivelog all completed before '时间';
# 其中,时间需要根据情况设置,表示删除早于该时间的归档日志,比如'SYSDATE - 3',表示保留近3天的日志
设置自动清理日志脚本
rman target / nocatalog << EOF
run {
allocate channel d1 type disk;
delete noprompt archivelog all completed before 'SYSDATE - 3';
release channel d1;
}
exit;
EOF
其中,'SYSDATE - 3'表示保留近三天的日志,按需设置
归档日志的备份和恢复
# 备份归档日志
RMAN> backup archivelog all;
# 在进行数据库恢复时,可能需要使用备份的归档日志进行恢复。
RMAN> restore archivelog all;
# 恢复完归档日志后,需要将恢复的归档日志应用到数据库中,可以在SQL*Plus命令行界面输入以下命令进行恢复:
sql> recover database;
情况二:存储占满导致无法登录账户时
先删除一部分日志文件后,使得账户能够登录oracle,再进行情况一的操作删除多余日志
# 使用root用户
# 查看存储情况
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 1.1M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda1 69G 38G 28G 58% /
tmpfs 781M 0 781M 0% /run/user/0
# 其中/dev/vda1中的Used表示当前日志存储空间剩余容量
# 按天删除
# 查看某天日志数量
$ ls /u01/app/oracle/admin/s4orcl/adump |grep 20230701 |wc -l
# 删除某天日志
$ rm -rf /u01/app/oracle/admin/s4orcl/adump/*20230701*
# 按月删除
# 查看某月日志数量
$ ls /u01/app/oracle/admin/s4orcl/adump |grep 202307 |wc -l
# 删除某月10天日志
$ rm -rf /u01/app/oracle/admin/s4orcl/adump/*2023070*
$ rm -rf /u01/app/oracle/admin/s4orcl/adump/*2023071*
$ rm -rf /u01/app/oracle/admin/s4orcl/adump/*2023072*
$ rm -rf /u01/app/oracle/admin/s4orcl/adump/*2023073*
# 删除某月日志
$ rm -rf /u01/app/oracle/admin/s4orcl/adump/*202307*