大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。

@TOC

前言

Oracle 数据库有 db_name 和 db_unique_name 的区别,在搭建 DG 的时候,要求主备的 db_unique_name 必须不一致,所以我们通过 DG 的方式迁移数据库后,通过切换后新的主库 db_unique_name 会与原主库不一致。

这时候,如果想修改 db_unique_name,该怎么做呢?

通常是切换成功后,手动修改新主库的 db_unique_name:

  • 单机:直接 alter system(scope=spfile)修改,重启数据库会自动更新对应参数文件。
  • RAC:比较复杂,本文会详细介绍。

单机

首先,在数据库中修改 db_unique_name:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- 查看当前 db_unique_name
SQL> show parameter db_unique_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string lucifer

-- 修改 db_unique_name 为 luciferdg
SQL> alter system set db_unique_name=luciferdg scope=spfile;

System altered.

-- 关闭数据库
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

-- 重启数据库生效
SQL> startup
ORACLE instance started.

Total System Global Area 5351930904 bytes
Fixed Size 8907800 bytes
Variable Size 922746880 bytes
Database Buffers 4412407808 bytes
Redo Buffers 7868416 bytes
Database mounted.
Database opened.

-- 查看修改后的 db_unique_name
SQL> show parameter db_unique_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string LUCIFERDG

查看参数文件是否已经更新:

1
2
3
[oracle@orcl19c:/home/oracle]$ cd $ORACLE_HOME/dbs
[oracle@orcl19c:/u01/app/oracle/product/19.3.0/db/dbs]$ strings spfilelucifer.ora | grep db_unique_name
*.db_unique_name='LUCIFERDG'

单机数据库修改成功。

RAC

生成参数文件

查看当前参数文件位置,生成本地参数文件:

1
2
3
SQL> show parameter pfile
-- 如果存在 /u01/app/oracle/product/12.1.0/db/dbs/initlucifer.ora 文件,建议手动备份一下
SQL> create pfile='/u01/app/oracle/product/12.1.0/db/dbs/initlucifer.ora' from spfile;

移除原数据库资源

关闭并且移除数据库资源:

1
2
$ srvctl stop database -d lucifer
$ srvctl remove database -d lucifer

修改参数文件

手工修改参数文件中的 db_unique_name:

1
*.db_unique_name=luciferdg

如果存在 db_domain 配置,也需要修改(我这里没有配置,不做修改):

1
## *.db_domain=<domain>

启动数据库实例

在主节点手动启动数据库实例:

1
2
3
4
5
-- 这里默认使用开始创建的 initlucifer.ora 参数文件启动
SQL> Startup;

-- 检查 global_name
SQL> select * from global_name;

重新创建参数文件到 ASM 磁盘中:

1
SQL> create spfile='+DATA/LUCIFERDG/spfilelucifer.ora' from pfile;

添加新数据库资源

重新添加数据库资源到集群中:

1
2
3
$ srvctl add database -db luciferdg -dbname lucifer -oraclehome $ORACLE_HOME -dbtype RAC -spfile +DATA/LUCIFERDG/spfilelucifer.ora -diskgroup DATA
$ srvctl add instance -d luciferdg -i lucifer1 -n rac01
$ srvctl add instance -d luciferdg -i lucifer2 -n rac02

重启数据库实例:

1
$ srvctl start database -d luciferdg

在线移动数据文件

切换数据文件路径:

1
2
3
4
5
6
7
8
9
SQL> SELECT 'ALTER DATABASE MOVE DATAFILE ' || file_id || ';' FROM dba_data_files;

'ALTERDATABASEMOVEDATAFILE'||FILE_ID||';'
----------------------------------------------------------------------
ALTER DATABASE MOVE DATAFILE 1;
ALTER DATABASE MOVE DATAFILE 3;
ALTER DATABASE MOVE DATAFILE 5;
ALTER DATABASE MOVE DATAFILE 6;
ALTER DATABASE MOVE DATAFILE 4;

切换控制文件

备份控制文件:

1
SQL> alter database backup controlfile to '/home/oraprod/lucifer.ctl';

RMAN 还原控制文件:

1
RMAN> restore controlfile to '+DATA' from '+DATA/LUCIFER/CONTROLFILE/current.261.1192804305';

更新spfile控制文件参数:

1
2
SQL> alter system set control_files='+DATA/LUCIFERDG/CONTROLFILE/current.260.1195424101' scope=spfile sid='*';
-- alter system set control_files='+DATA/LUCIFERDG/CONTROLFILE/current.260.1195424101','+DATADG3/RACDB/CONTROLFILE/current.258.1110065841' scope=spfile sid='*';

重建 REDO 日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
-- 查看在线日志
SQL> set line2222 pages1000
select * from v$log;

-- 新增临时在线日志
SQL> alter database add logfile thread 1
group 5 size 100M,
group 6 size 100M;

alter database add logfile thread 2
group 7 size 100M,
group 8 size 100M;

-- 切换日志
alter system archive log current;
alter system checkpoint;

-- 删掉错误路径的日志文件(确保日志状态为 INACTIVE)
SQL> alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database drop logfile group 4;

-- 重新添加在线日志(刚删除的)
SQL> alter database add logfile thread 1
group 1 size 100M,
group 2 size 100M;

alter database add logfile thread 2
group 3 size 100M,
group 4 size 100M;

-- 删除临时在线日志(确保日志状态为 INACTIVE)
SQL> alter database drop logfile group 5;
alter database drop logfile group 6;
alter database drop logfile group 7;
alter database drop logfile group 8;

-- 再次查看在线日志
SQL> col member for a100
select member from v$logfile;

MEMBER
----------------------------------------------------------------------------------------------------
+DATA/LUCIFERDG/ONLINELOG/group_1.266.1195465603
+DATA/LUCIFERDG/ONLINELOG/group_2.262.1195465611
+DATA/LUCIFERDG/ONLINELOG/group_3.276.1195465617
+DATA/LUCIFERDG/ONLINELOG/group_4.277.1195465627

可以看到在线日志的路径已经切换到新的目录。

重建临时表空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
-- 查看当前默认临时表空间
SQL> col PROPERTY_NAME for a30
col PROPERTY_VALUE for a20
SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
DEFAULT_TEMP_TABLESPACE TEMP

-- 记录原始表空间文件
SQL> col file_name for a100
select file_name from dba_temp_files where tablespace_name = 'TEMP';

FILE_NAME
----------------------------------------------------------------------------------------------------
+DATA/LUCIFER/TEMPFILE/temp.264.1192804321

-- 创建临时的临时表空间 tempdata
create temporary tablespace tempdata tempfile '+DATA' size 1G autoextend on;

-- 切换默认临时表空间为临时的临时表空间
alter database default temporary tablespace tempdata;

-- 删除原始临时表空间 temp
drop tablespace temp including contents and datafiles cascade constraints;

-- 重建原始临时表空间 temp
create temporary tablespace temp tempfile '+DATA' size 1G autoextend on;

-- 切换默认临时表空间为原始临时表空间 TEMP
alter database default temporary tablespace temp;

--删除临时表空间
drop tablespace tempdata including contents and datafiles cascade constraints;

-- 新增临时表空间 temp 数据文件(根据原始临时表空间文件数量来新增)
-- alter tablespace temp add tempfile '+DATA' size 1g autoextend on;

-- 检查默认临时表空间以及文件路径
SQL> col PROPERTY_NAME for a30
col PROPERTY_VALUE for a20
SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
DEFAULT_TEMP_TABLESPACE TEMP

-- 记录原始表空间文件
SQL> col file_name for a100
select file_name from dba_temp_files where tablespace_name = 'TEMP';

FILE_NAME
----------------------------------------------------------------------------------------------------
+DATA/LUCIFERDG/TEMPFILE/temp.264.1195466599

可以看到临时表空间文件路径已经切换。


参考 MOS 文章: