/home/dmdba/dmdata/test/TESTDB/home/dmdba/dmdata/test/arch 和 /home/dmdba/dmdata/test/arch2TEST.EMPLOYEE(含 100003 条记录)| 对比项 | Redo 日志(联机日志) | 归档日志(归档日志) |
|---|---|---|
| 定义 | 数据库运行时记录所有数据变更的日志文件,用于崩溃恢复 | Redo 日志的历史备份,将写满的 Redo 日志复制到归档目录保存 |
| 存储位置 | 数据目录下(与数据文件同目录) | 独立归档目录(可配置多个) |
| 文件命名 | TESTDB01.log、TESTDB02.log | ARCHIVE_LOCAL1_0x27F1AC6_EP0_2026-07-28_14-51-13.log |
| 生命周期 | 循环使用,写满后自动覆盖 | 永久保存(除非手动清理或达到空间限制) |
| 用途 | 实例恢复(崩溃恢复,数据库重启时自动应用) | 介质恢复(时间点恢复、增量备份、灾难恢复) |
| 是否必须 | 必须(数据库运行的基础) | 可选(但强烈建议开启) |
# 以 dmdba 用户登录
su - dmdba
/home/dmdba/dmdbms/bin/disql SYSDBA/Dameng123@localhost:5239
参数说明:
SYSDBA:数据库用户名(管理员账户)Dameng123:密码localhost:数据库主机地址5239:数据库端口号(测试实例)执行命令:
-- 先查看视图结构,确认列名
DESC V$RLOGFILE;
输出:
行号 NAME TYPE$ NULLABLE
----- ------------- ------------ --------
1 GROUP_ID INT Y
2 FILE_ID INT Y
3 PATH VARCHAR(256) Y
4 CLIENT_PATH VARCHAR(256) Y
5 CREATE_TIME TIMESTAMP(6) Y
6 RLOG_SIZE BIGINT Y
7 MIN_EXEC_VER VARCHAR(64) Y
8 MIN_DCT_VER INT Y
列含义:
GROUP_ID:Redo 日志组编号(同一组内文件互为镜像)FILE_ID:文件编号(从 0 开始)PATH:文件物理路径RLOG_SIZE:单个文件大小(字节)CREATE_TIME:文件创建时间查看实际配置:
SELECT GROUP_ID, FILE_ID, PATH, RLOG_SIZE/1024/1024 AS SIZE_MB FROM V$RLOGFILE;
输出:
行号 GROUP_ID FILE_ID PATH SIZE_MB
----- --------- -------- ---------------------------------------------------------- --------
1 2 0 /home/dmdba/dmdata/test/TESTDB/TESTDB01.log 4096
2 2 1 /home/dmdba/dmdata/test/TESTDB/TESTDB02.log 4096
结论:当前 Redo 日志为 2 个文件,每个 4GB,共 8GB 循环空间。
在尝试修改 Redo 日志大小之前,执行了以下命令在 dm.ini 文件中查找 RLOG_SIZE 参数:
grep -i "rlog" /home/dmdba/dmdata/test/TESTDB/dm.ini
输出:
CKPT_RLOG_SIZE = 1024 #Checkpoint rlog size. 0: Ignore; else: generate with redo log size
查询结果分析:
CKPT_RLOG_SIZE = 1024,没有找到 RLOG_SIZECKPT_RLOG_SIZE 是检查点触发生成的 Redo 日志大小阈值,与 Redo 日志文件大小(RLOG_SIZE)是不同的参数RLOG_SIZE 控制,但该参数在 dm.ini 中未显式设置,采用默认值(4096MB,即 4GB)dm.ini 来调整 Redo 日志文件大小执行命令:
-- 先查看视图结构
DESC V$RLOG;
输出(节选):
行号 NAME TYPE$ NULLABLE 含义
----- -------------- ------ --------- ------------------------
1 CKPT_LSN BIGINT Y 检查点 LSN
2 FILE_LSN BIGINT Y 文件 LSN
3 FLUSH_LSN BIGINT Y 已刷盘 LSN
4 CUR_LSN BIGINT Y 当前写入 LSN
14 FREE_SPACE BIGINT Y 空闲空间(字节)
15 TOTAL_SPACE BIGINT Y 总空间(字节)
查看使用情况:
SELECT TOTAL_SPACE/1024/1024 AS TOTAL_MB,
(TOTAL_SPACE - FREE_SPACE)/1024/1024 AS USED_MB,
FREE_SPACE/1024/1024 AS FREE_MB
FROM V$RLOG;
输出:
行号 TOTAL_MB USED_MB FREE_MB
----- --------- -------- --------
1 8191 10 8181
参数含义:
TOTAL_MB:Redo 日志总空间,当前 8191 MB(约 8GB)USED_MB:已使用空间,当前 10 MB(少量使用)FREE_MB:空闲空间,当前 8181 MB(大部分空闲)执行命令:
SELECT CUR_LSN, FLUSH_LSN, CKPT_LSN, FREE_SPACE/1024/1024 AS FREE_MB FROM V$RLOG;
输出:
行号 CUR_LSN FLUSH_LSN CKPT_LSN FREE_MB
----- -------- ---------- --------- --------
1 159941 159941 56778 8181
LSN 相关概念:
CUR_LSN:当前正在写入的 LSN,即最新生成的日志序列号FLUSH_LSN:已刷盘的 LSN,已写入磁盘的日志(小于等于 CUR_LSN)CKPT_LSN:检查点 LSN,已写入数据文件的日志(小于等于 FLUSH_LSN)解读:
CUR_LSN = FLUSH_LSN:所有日志已写入磁盘,无积压CKPT_LSN 落后于 CUR_LSN:检查点定期将数据写入数据文件,日志持续增长,这是正常现象操作前确认:当前有 2 个 Redo 日志文件,增加到 3 个。
步骤 1:切换 MOUNT 状态
ALTER DATABASE MOUNT;
步骤 2:添加日志文件
ALTER DATABASE ADD LOGFILE 'TESTDB03.log' SIZE 4096;
遇到错误:
[-510]:系统处于MOUNT状态.
原因:在 MOUNT 状态下执行此命令报错,需要先切换到 OPEN 状态。
解决方法:
ALTER DATABASE OPEN;
ALTER DATABASE ADD LOGFILE 'TESTDB03.log' SIZE 4096;
步骤 3:验证
SELECT GROUP_ID, FILE_ID, PATH, RLOG_SIZE/1024/1024 AS SIZE_MB FROM V$RLOGFILE;
输出:
行号 GROUP_ID FILE_ID PATH SIZE_MB
----- --------- -------- ---------------------------------------------------------- --------
1 2 0 /home/dmdba/dmdata/test/TESTDB/TESTDB01.log 4096
2 2 1 /home/dmdba/dmdata/test/TESTDB/TESTDB02.log 4096
3 2 2 /home/dmdba/dmdata/test/TESTDB/TESTDB03.log 4096
结论:成功添加第 3 个 Redo 日志文件。
| 操作 | 是否可行 | 方法 | 注意事项 |
|---|---|---|---|
| 扩大小 | 部分可行 | 修改 dm.ini 中 RLOG_SIZE 参数(需重建控制文件),生产环境不推荐 | 该参数在 dm.ini 中通常未显式设置,采用默认值 4096MB |
| 增加文件 | 可行 | ALTER DATABASE ADD LOGFILE '文件名.log' SIZE xxx |
在 OPEN 状态下执行 |
| 上限 | 受文件系统限制 | 建议单文件 256MB~2GB | 总量不宜过大 |
| 一般建议 | 2~4 个文件 | 每个 256MB~1GB | 根据事务量调整,减少切换频率 |
第一步:检查当前归档状态
SELECT NAME, ARCH_MODE, STATUS$ FROM V$DATABASE;
输出:
行号 NAME ARCH_MODE STATUS$
----- ------ ---------- --------
1 TESTDB N 4
列含义:
NAME:数据库名称,当前为 TESTDBARCH_MODE:归档模式,N 表示未开启,Y 表示已开启STATUS$:数据库状态,4 表示 OPEN,1 表示 MOUNT,2 表示 SUSPEND第二步:修改 dm.ini 开启归档配置
# 备份配置文件
cp /home/dmdba/dmdata/test/TESTDB/dm.ini /home/dmdba/dmdata/test/TESTDB/dm.ini.bak
# 修改 ARCH_INI 参数(vi 或 nano 编辑)
vi /home/dmdba/dmdata/test/TESTDB/dm.ini
找到 ARCH_INI = 0,改为:
ARCH_INI = 1
第三步:重启实例使配置生效
# 停止实例
ps -ef | grep dmserver | grep 5239
kill -9 <PID>
# 重新启动
nohup /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dmdata/test/TESTDB/dm.ini > /home/dmdba/dmdata/test/dm.log 2>&1 &
第四步:创建归档目录
mkdir -p /home/dmdba/dmdata/test/arch
chown dmdba:dinstall /home/dmdba/dmdata/test/arch
第五步:添加归档配置
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmdata/test/arch, TYPE=LOCAL, FILE_SIZE=128, SPACE_LIMIT=1024';
ALTER DATABASE OPEN;
遇到错误:
[-810]:系统未配置归档
原因:dm.ini 中 ARCH_INI 未正确设置为 1,或修改后未重启实例。
解决方法:确认 ARCH_INI=1 后重启实例,再执行上述命令。
第六步:验证归档状态
SELECT NAME, ARCH_MODE, STATUS$ FROM V$DATABASE;
输出:
行号 NAME ARCH_MODE STATUS$
----- ------ ---------- --------
1 TESTDB Y 4
ARCH_MODE 变为 Y,归档模式已开启。
执行命令:
-- 先查看视图结构
DESC V$DM_ARCH_INI;
输出(节选):
行号 NAME TYPE$ NULLABLE 含义
----- ------------------ ------------ --------- ------------------------
1 ARCH_NAME VARCHAR(128) Y 归档配置名称
2 ARCH_TYPE VARCHAR(128) Y 归档类型(LOCAL/REMOTE)
3 ARCH_DEST VARCHAR(512) Y 归档目标目录
4 ARCH_FILE_SIZE INT Y 单个归档文件大小(MB)
5 ARCH_SPACE_LIMIT INT Y 归档总空间限制(MB)
6 ARCH_IS_VALID CHAR(1) Y 是否有效(Y/N)
查看当前配置:
SELECT ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT, ARCH_IS_VALID FROM V$DM_ARCH_INI;
输出:
行号 ARCH_DEST ARCH_FILE_SIZE ARCH_SPACE_LIMIT ARCH_IS_VALID
----- ---------------------------- --------------- ----------------- -------------
1 /home/dmdba/dmdata/test/arch 128 1024 Y
参数含义:
ARCH_DEST:归档日志存放目录ARCH_FILE_SIZE:单个归档文件大小(MB)ARCH_SPACE_LIMIT:归档总空间限制(MB),超过后自动清理ARCH_IS_VALID:配置是否有效场景:将归档文件大小从 128MB 改为 256MB。
正确语法(关键:不需要 SET 关键字):
ALTER DATABASE MOUNT;
ALTER DATABASE MODIFY ARCHIVELOG 'DEST=/home/dmdba/dmdata/test/arch, TYPE=LOCAL, FILE_SIZE=256, SPACE_LIMIT=1024';
ALTER DATABASE OPEN;
遇到错误(一):
第 1 行, 第 101 列[SET]附近出现错误[-2007]:语法分析出错.
原因:误用了 SET 关键字,正确语法为直接指定 FILE_SIZE=256。
遇到错误(二):
[-2004]:不支持的语句类型.
原因:DELETE ARCHIVELOG 语法在当前版本不支持。
解决方法:使用正确的 MODIFY 语法,直接指定 FILE_SIZE 值。
验证:
SELECT ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT, ARCH_IS_VALID FROM V$DM_ARCH_INI;
输出:
行号 ARCH_DEST ARCH_FILE_SIZE ARCH_SPACE_LIMIT ARCH_IS_VALID
----- ---------------------------- --------------- ----------------- -------------
1 /home/dmdba/dmdata/test/arch 256 1024 Y
ARCH_FILE_SIZE 从 128 变为 256,修改成功。
场景:增加第二个归档目标 /home/dmdba/dmdata/test/arch2,实现归档双写或负载分担。
步骤 1:创建目录
mkdir -p /home/dmdba/dmdata/test/arch2
chown dmdba:dinstall /home/dmdba/dmdata/test/arch2
步骤 2:添加归档目标
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmdata/test/arch2, TYPE=LOCAL, FILE_SIZE=256, SPACE_LIMIT=2048';
ALTER DATABASE OPEN;
步骤 3:验证
SELECT ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT, ARCH_IS_VALID FROM V$DM_ARCH_INI;
输出:
行号 ARCH_DEST ARCH_FILE_SIZE ARCH_SPACE_LIMIT ARCH_IS_VALID
----- ----------------------------- --------------- ----------------- -------------
1 /home/dmdba/dmdata/test/arch 256 1024 Y
2 /home/dmdba/dmdata/test/arch2 256 2048 Y
两个归档目标同时生效,归档日志会分别写入两个目录。
执行命令:
-- 先查看视图结构
DESC V$ARCHIVED_LOG;
输出(节选):
行号 NAME TYPE$ NULLABLE 含义
----- ------------------ ------------ --------- ----------------------------
1 RECID INT Y 归档日志记录 ID
3 NAME VARCHAR(513) Y 归档日志文件名(含路径)
10 FIRST_CHANGE# BIGINT Y 起始 LSN
11 FIRST_TIME DATETIME(6) Y 归档开始时间
12 NEXT_CHANGE# BIGINT Y 结束 LSN
13 NEXT_TIME DATETIME(6) Y 归档结束时间
23 COMPLETION_TIME DATETIME(6) Y 归档完成时间
查看归档日志列表:
SELECT NAME, FIRST_CHANGE# AS FIRST_LSN, NEXT_CHANGE# AS NEXT_LSN, FIRST_TIME,
BLOCKS * BLOCK_SIZE / 1024 / 1024 AS SIZE_MB
FROM V$ARCHIVED_LOG
ORDER BY FIRST_CHANGE# DESC;
输出:
行号 NAME FIRST_LSN NEXT_LSN FIRST_TIME SIZE_MB
----- -------------------------------------------------------------------------------- ---------- --------- -------------------------- --------
1 /home/dmdba/dmdata/test/arch/ARCHIVE_LOCAL1_0x27F1AC6_EP0_2026-07-28_14-51-13.log 56918 159941 2026-07-28 14:51:13.219952 NULL
2 /home/dmdba/dmdata/test/arch/ARCHIVE_LOCAL1_0x27F1AC6_EP0_2026-07-28_14-49-09.log 56876 56918 2026-07-28 14:49:09.863572 NULL
参数含义:
NAME:归档日志文件名,包含时间戳,按顺序生成FIRST_LSN:该归档日志起始 LSN,即日志的起始序列号NEXT_LSN:该归档日志结束 LSN,即日志的结束序列号(下一归档的起始 LSN)FIRST_TIME:归档开始时间,即归档文件创建时间SIZE_MB:文件大小,本次查询因 BLOCKS 为空显示 NULL关键理解:
56876-56918 到 56918-159941场景:已知 LSN = 57000,需要找到它落在哪个归档日志以及对应的归档时间。
方法一:查询包含该 LSN 的归档日志
SELECT NAME, FIRST_TIME, COMPLETION_TIME, FIRST_CHANGE#, NEXT_CHANGE#
FROM V$ARCHIVED_LOG
WHERE FIRST_CHANGE# <= 57000 AND NEXT_CHANGE# > 57000;
输出:
行号 NAME FIRST_TIME COMPLETION_TIME FIRST_CHANGE# NEXT_CHANGE#
----- --------------------------------------------------------------------------------- -------------------------- --------------- -------------- ------------
1 /home/dmdba/dmdata/test/arch/ARCHIVE_LOCAL1_0x27F1AC6_EP0_2026-07-28_14-51-13.log 2026-07-28 14:51:13.219952 NULL 56918 159941
结果:LSN 57000 落在第二个归档日志中(56918 ≤ 57000 < 159941),对应时间为 2026-07-28 14:51:13。
方法二:使用系统函数(如果支持)
SELECT SF_GET_LSN_TIME(57000);
原理说明:
[FIRST_CHANGE#, NEXT_CHANGE#)场景:通过批量插入数据产生 Redo 日志,触发归档切换。
步骤 1:批量插入数据
INSERT INTO TEST.EMPLOYEE (ID, NAME, AGE, DEPT)
SELECT LEVEL + 10, '测试' || LEVEL, 20 + MOD(LEVEL, 30), '测试部'
FROM DUAL CONNECT BY LEVEL <= 100000;
输出:
影响行数 100000
步骤 2:手动切换 Redo 日志(强制归档)
ALTER SYSTEM SWITCH LOGFILE;
说明:该命令会切换 Redo 日志文件,写满的 Redo 日志会被归档进程复制到归档目录。但只有写满的 Redo 日志才会触发归档,如果当前 Redo 日志未写满,切换不会产生新归档。
步骤 3:查看归档目录
ls -lh /home/dmdba/dmdata/test/arch/
输出:
total 129M
-rw-r--r-- 1 dmdba dinstall 16K Jul 28 14:49 ARCHIVE_LOCAL1_0x27F1AC6_EP0_2026-07-28_14-49-09.log
-rw-r--r-- 1 dmdba dinstall 128M Jul 28 14:51 ARCHIVE_LOCAL1_0x27F1AC6_EP0_2026-07-28_14-51-13.log
说明:
FILE_SIZE=128 一致)| 操作 | 是否可行 | 方法 | 注意事项 |
|---|---|---|---|
| 扩大小 | 可行 | ALTER DATABASE MODIFY ARCHIVELOG 'DEST=...' FILE_SIZE=xxx |
需在 MOUNT 状态,语法中不加 SET |
| 增加文件/目标 | 可行 | ALTER DATABASE ADD ARCHIVELOG 'DEST=...' |
可配置多个归档目标 |
| 上限 | 受磁盘空间限制 | 通过 SPACE_LIMIT 控制 |
0 表示不限制 |
| 一般建议 | 设总上限,定期清理 | 如 SPACE_LIMIT=102400(100GB) |
建议归档和 Redo 分开存储 |
| 错误 | 原因 | 解决方法 |
|---|---|---|
[-810]:系统未配置归档 |
dm.ini 中 ARCH_INI=0 |
修改为 1 并重启实例 |
[-510]:系统处于MOUNT状态 |
在 MOUNT 状态执行不支持的操作 | 切换 OPEN 后重试,或确认是否需要在 MOUNT 状态 |
[-2007]:语法分析出错 |
SQL 语法错误,如误用 SET |
检查语法,参考官方文档修正 |
[-2004]:不支持的语句类型 |
该语法在当前版本不支持 | 使用替代语法或升级版本 |
[-980]:OPEN状态下仅允许添加... |
在 OPEN 状态添加 LOCAL 归档 | 先 ALTER DATABASE MOUNT |
[-2111]:无效的列名 |
视图列名与预期不一致 | 先 DESC 查看实际列名 |
[-6128]:无效的数字 |
对非数字列进行数值比较 | 调整查询条件 |
验证目的:确认所有修改在实例重启后仍然保留。
步骤 1:重启实例
ps -ef | grep dmserver | grep 5239
kill -9 <PID>
nohup /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dmdata/test/TESTDB/dm.ini > /home/dmdba/dmdata/test/dm.log 2>&1 &
步骤 2:验证 Redo 日志文件
SELECT GROUP_ID, FILE_ID, PATH, RLOG_SIZE/1024/1024 AS SIZE_MB FROM V$RLOGFILE;
预期输出:3 个 Redo 日志文件,TESTDB03.log 保留。
步骤 3:验证归档配置
SELECT ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT, ARCH_IS_VALID FROM V$DM_ARCH_INI;
预期输出:两条归档目标记录,FILE_SIZE=256,arch2 保留。
验证结果:所有配置在重启后保持。
| 问题 | Redo 日志 | 归档日志 |
|---|---|---|
| 能扩大小吗? | 可修改 dm.ini 中 RLOG_SIZE,需重建控制文件,生产环境不推荐 |
通过 MODIFY ARCHIVELOG 修改 FILE_SIZE,需 MOUNT 状态 |
| 能增加文件吗? | ALTER DATABASE ADD LOGFILE 'filename.log' SIZE xxx |
ALTER DATABASE ADD ARCHIVELOG 'DEST=...' |
| 上限是多少? | 受文件系统限制 | 受磁盘空间限制,通过 SPACE_LIMIT 控制 |
| 一般建议多少? | 2~4 个文件,每个 256MB~1GB | 设总上限(如 100GB),定期转储清理 |
| LSN 定位 | 不适用 | V$ARCHIVED_LOG 的 FIRST_CHANGE#/NEXT_CHANGE# 区间定位 |
-- 1. 查看 Redo 日志配置
SELECT GROUP_ID, FILE_ID, PATH, RLOG_SIZE/1024/1024 AS SIZE_MB FROM V$RLOGFILE;
-- 2. 查看 Redo 日志使用情况
SELECT TOTAL_SPACE/1024/1024 AS TOTAL_MB,
(TOTAL_SPACE - FREE_SPACE)/1024/1024 AS USED_MB,
FREE_SPACE/1024/1024 AS FREE_MB
FROM V$RLOG;
-- 3. 查看 LSN 推进情况
SELECT CUR_LSN, FLUSH_LSN, CKPT_LSN, FREE_SPACE/1024/1024 AS FREE_MB FROM V$RLOG;
-- 4. 查看归档状态
SELECT NAME, ARCH_MODE, STATUS$ FROM V$DATABASE;
-- 5. 查看归档配置
SELECT ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT, ARCH_IS_VALID FROM V$DM_ARCH_INI;
-- 6. 开启归档(需 MOUNT 状态)
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/path/to/arch, TYPE=LOCAL, FILE_SIZE=128, SPACE_LIMIT=1024';
ALTER DATABASE OPEN;
-- 7. 增加 Redo 日志文件(OPEN 状态)
ALTER DATABASE ADD LOGFILE 'TESTDB03.log' SIZE 4096;
-- 8. 修改归档文件大小(MOUNT 状态,不加 SET)
ALTER DATABASE MODIFY ARCHIVELOG 'DEST=/path/to/arch, TYPE=LOCAL, FILE_SIZE=256, SPACE_LIMIT=1024';
-- 9. 增加归档目标
ALTER DATABASE ADD ARCHIVELOG 'DEST=/path/to/arch2, TYPE=LOCAL, FILE_SIZE=256, SPACE_LIMIT=2048';
-- 10. 查看归档日志列表及 LSN 区间
SELECT NAME, FIRST_CHANGE# AS FIRST_LSN, NEXT_CHANGE# AS NEXT_LSN, FIRST_TIME,
BLOCKS * BLOCK_SIZE / 1024 / 1024 AS SIZE_MB
FROM V$ARCHIVED_LOG ORDER BY FIRST_CHANGE# DESC;
-- 11. 根据 LSN 定位归档时间
SELECT NAME, FIRST_TIME, COMPLETION_TIME, FIRST_CHANGE#, NEXT_CHANGE#
FROM V$ARCHIVED_LOG
WHERE FIRST_CHANGE# <= 目标LSN AND NEXT_CHANGE# > 目标LSN;
-- 12. 手动切换 Redo 日志(触发归档)
ALTER SYSTEM SWITCH LOGFILE;
-- 13. 批量插入数据产生 Redo 日志
INSERT INTO TEST.EMPLOYEE (ID, NAME, AGE, DEPT)
SELECT LEVEL + 10, '测试' || LEVEL, 20 + MOD(LEVEL, 30), '测试部'
FROM DUAL CONNECT BY LEVEL <= 100000;
-- 14. 查询 dm.ini 中的 RLOG_SIZE 参数(操作系统命令)
grep -i "rlog" /home/dmdba/dmdata/test/TESTDB/dm.ini
文章
阅读量
获赞
