Oracle 数据库迁移操作手册
Oracle 数据库迁移操作手册(oracle-migrate-bash)
场景
目前遇到的场景是: 1.1T数据量进行异机迁移,并且是由rac模式(分布式模式)迁移至单体模式
迁移方式
总体迁移方式分为以下3种:
- 使用rman官方工具进行迁移
- 使用plsql或navicat等第三方工具进行迁移, 如plsql可以导出plsql的特有二进制格式进行横向迁移
- 使用sql进行导出操作,类似于mysql的sqldump工具
选择迁移方式
由于当前数据量过大, 只能从第一和第二种方式选择, 但是我们的场景是纯内网环境, 且原有rac模式已经使用nas进行数据备份, 可以做到同网络下千兆宽带无感知移动文件, 所以选择第一种方式进行迁移.
数据迁移前期准备工作
1. 操作系统参数检查
1.1 系统内核参数
注意当前参数为核心参数, 会影响到同服务器下的其他应用, 建议安装oracle时进行独立安装, 不要与其他应用放置在同一服务器
检查文件:/etc/sysctl.conf
# 文件最大句柄数量
fs.file-max = 6815744
# 文件异步通道数量
fs.aio-max-nr = 1048576
# 内核核心参数(尽量不要修改)
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 4294967296
kernel.shmmax = 4398046511104
# 网络核心参数(尽量不要修改)
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.ip_local_port_range = 9000 65500
执行生效:
sysctl -p
1.2 硬件限制
检查文件:/etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
1.3 Linux 安全组件
检查文件:/etc/selinux/config
SELINUX=disabled
重启服务器使其生效。
2. 切换到oracle用户执行如下操作
su - oracle
sqlplus / as sysdba
3. 查看内存配置
SELECT
name,
display_value,
isdefault
FROM v$parameter
WHERE name IN (
'memory_target',
'memory_max_target',
'sga_target',
'sga_max_size',
'pga_aggregate_target',
'shared_pool_size',
'db_cache_size',
'large_pool_size',
'java_pool_size'
)
ORDER BY name;
当前为 ASMM 模式:
- SGA:9.2G
- PGA:3G
2.1 怎么区分内存模式?
oracle根据历史原因分为三种内存模式, 直接内存, amm, asmm
- 直接内存: 可以手动针对所有的内存点进行配置, 如针对sid进行配置
- amm模式: 直接分配整体内存, 由oracle自主分配
- asmm模式: 可以区分系统内存与业务内存, 分别配置后可以由oracle自主分配
4. 游标数量设置
SHOW PARAMETER open_cursors;
ALTER SYSTEM SET open_cursors = 1500 SCOPE=BOTH;
5. 快速恢复区大小
SHOW PARAMETER db_recovery_file_dest_size;
ALTER SYSTEM SET db_recovery_file_dest_size = 300G SCOPE=BOTH;
6. 会话连接数
SHOW PARAMETER sessions;
当前值:1952
7. 最大物理进程数
SHOW PARAMETER processes;
ALTER SYSTEM SET processes = 1280 SCOPE=SPFILE;
⚠️ 需要重启数据库生效
8. 关闭密码过期策略
SELECT username, profile FROM dba_users;
SELECT * FROM dba_profiles WHERE resource_name = 'PASSWORD_LIFE_TIME';
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER PROFILE ORA_STIG_PROFILE LIMIT PASSWORD_LIFE_TIME UNLIMITED;
9. 数据库字符集确认
SELECT * FROM nls_database_parameters;
确认与源库保持一致
10. 兼容旧版本客户端连接
编辑文件(如果没有需要创建):$ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
11. 关闭审计功能
SELECT value FROM v$option WHERE parameter = 'Unified Auditing';
SHOW PARAMETER audit_trail;
ALTER SYSTEM SET audit_trail = NONE SCOPE=SPFILE;
⚠️ 需要重启数据库
SHUTDOWN ABORT;
STARTUP MOUNT;
ALTER DATABASE OPEN;
数据迁移开始
具体脚本请查看我的github仓库: https://github.com/HeyAlaia/oracle-migrate-bash
12. 清除快速恢复区
rm -rf /u01/app/oracle/fast_recovery_area/alaia/*
touch /u01/app/oracle/fast_recovery_area/alaia/control02.ctl
ll /u01/app/oracle/fast_recovery_area/alaia/
13. RMAN 全量恢复
-- 挂载nas
mount -t nfs 127.0.0.1:/mnt/oracle_backup/wljk_backup /backup_2024
-- 获取dbid
SELECT dbid FROM v$database;
-- 获取newname名称
SELECT 'set newname for datafile ' || t.RFILE# || ' to ''' || t.NAME || ''';'
FROM v$datafile t;
- old_dbid = 3080101081
- new_dbid = 3435667710
执行脚本:all_recovery_data.sh
14. RMAN 增量恢复
执行脚本:append_recovery_data.sh
SELECT dbid FROM v$database;
15. 查看节点恢复位置
SELECT thread#, group#, sequence#, first_change#, next_change#, status
FROM v$log
ORDER BY 1,4;
RECOVER DATABASE UNTIL SCN 26202550276;
16. Redo Log 日志路径处理
SET PAGESIZE 100
SELECT member FROM v$logfile;
16.1. Redo Log 日志路径处理脚本
alter database rename file '+FRA/alaia/ONLINELOG/group_2.2239.1040153341' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_2.2239.1040153341';
alter database rename file '+FRA/alaia/ONLINELOG/group_3.2240.1040153343' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_3.2240.1040153343';
alter database rename file '+FRA/alaia/ONLINELOG/group_1.2238.1040154185' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_1.2238.1040154185';
alter database rename file '+FRA/alaia/ONLINELOG/group_4.2241.1040153343' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_4.2241.1040153343';
alter database rename file '+FRA/alaia/ONLINELOG/group_5.2242.1040153363' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_5.2242.1040153363';
alter database rename file '+FRA/alaia/ONLINELOG/group_6.2243.1040154189' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_6.2243.1040154189';
alter database rename file '+FRA/alaia/ONLINELOG/group_7.2234.1040153441' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_7.2234.1040153441';
alter database rename file '+FRA/alaia/ONLINELOG/group_8.2235.1040153441' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_8.2235.1040153441';
alter database rename file '+FRA/alaia/ONLINELOG/group_9.2237.1040153465' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_9.2237.1040153465';
alter database rename file '+FRA/alaia/ONLINELOG/group_10.2236.1040153471' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_10.2236.1040153471';
alter database rename file '+FRA/alaia/ONLINELOG/group_11.2232.1039560133' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_11.2232.1039560133';
alter database rename file '+FRA/alaia/ONLINELOG/group_12.2231.1039560133' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_12.2231.1039560133';
alter database rename file '+FRA/alaia/ONLINELOG/group_13.2244.1039560133' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_13.2244.1039560133';
alter database rename file '+FRA/alaia/ONLINELOG/group_14.2245.1039560133' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_14.2245.1039560133';
alter database rename file '+FRA/alaia/ONLINELOG/group_15.2246.1039560133' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_15.2246.1039560133';
alter database rename file '+FRA/alaia/ONLINELOG/group_16.2247.1039560135' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_16.2247.1039560135';
alter database rename file '+FRA/alaia/ONLINELOG/group_17.2250.1039560543' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_17.2250.1039560543';
alter database rename file '+FRA/alaia/ONLINELOG/group_18.2251.1039560545' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_18.2251.1039560545';
alter database rename file '+FRA/alaia/ONLINELOG/group_19.2252.1039560545' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_19.2252.1039560545';
alter database rename file '+FRA/alaia/ONLINELOG/group_20.2253.1039560545' to '/u01/app/oracle/fast_recovery_area/alaia/onlinelog/group_20.2253.1039560545';
批量执行
ALTER DATABASE RENAME FILE,将 ASM 路径迁移至文件系统(略,见原始清单)
17. TEMP 表空间处理
SELECT file#, name, status FROM v$tempfile;
17.1. TEMP 表创建
SHUTDOWN ABORT;
STARTUP MOUNT;
ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN UPGRADE;
ALTER TABLESPACE temp DROP TEMPFILE '+DATA/alaia/TEMPFILE/temp.dbf';
ALTER TABLESPACE temp
ADD TEMPFILE '/u01/app/oracle/oradata/alaia/temp01.dbf'
SIZE 10G
AUTOEXTEND ON
NEXT 1G
MAXSIZE 100G;
18. 启动数据库(异常)
SHUTDOWN ABORT;
STARTUP MOUNT;
ALTER DATABASE OPEN;
错误信息:
ORA-00603: ORACLE server session terminated by fatal error
ORA-01092: ORACLE instance terminated
ORA-00704: bootstrap process failure
ORA-00604: recursive SQL error
ORA-00904: "ACDRROWTSINTCOL#": invalid identifier
19. 处理联合错误(升级脚本)
执行脚本:start_upgrade.sh
sqlplus / as sysdba
shutdown abort;
startup mount;
alter database open upgrade;
select instance_name, status, database_status from v$instance;
exit
cd $ORACLE_HOME/rdbms/admin
$ORACLE_HOME/perl/bin/perl catctl.pl catupgrd.sql
cat catupgrd0.log | grep ORA-
20. 再次启动数据库
SHUTDOWN ABORT;
STARTUP MOUNT;
ALTER DATABASE OPEN;
数据迁移校验
21. 配置系统自启动(systemd)
cat > /etc/systemd/system/oracle.service << 'EOF'
[Unit]
Description=Oracle 12c
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
User=oracle
Environment="ORACLE_HOME=/u01/app/oracle/product/12.1.0/db_1"
ExecStart=/u01/app/oracle/product/12.1.0/db_1/bin/dbstart /u01/app/oracle/product/12.1.0/db_1
ExecStop=/u01/app/oracle/product/12.1.0/db_1/bin/dbshut /u01/app/oracle/product/12.1.0/db_1
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable oracle
22. 验证数据
SELECT date
FROM (
SELECT t.*
FROM test
)
WHERE ROWNUM = 1;
✅ 迁移完成
浙公网安备 33010602011771号