公司业务系统的数据库磁盘空间告急,无奈采购的磁盘没到货。经过商讨制定了临时方案
先来看一下主备库磁盘状态。
#主库磁盘信息
[oracle@db01 db]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-lv_root50G 5.1G 42G 11% /
tmpfs 127G 172K 127G 1% /dev/shm
/dev/mapper/data-lv_app41G 11G 28G 29% /app
/dev/sda2 190M 39M 141M 22% /boot
/dev/sda1 200M 264K 200M 1% /boot/efi
/dev/mapper/ssddata-oradata733G 537G 159G 78% /oradata
/dev/mapper/data-redo9.8G 5.6G 3.7G 60% /redo
/dev/mapper/data-arch148G 8.9G 132G 7% /arch#备库磁盘信息
[oracle@dbdg temp]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-root50G 6.5G 41G 14% /
tmpfs 127G 92K 127G 1% /dev/shm
/dev/sda2 186M 66M 111M 38% /boot
/dev/sda1 200M 268K 200M 1% /boot/efi
/dev/mapper/oradata-oradata549G 471G 51G 91% /oradata
/dev/mapper/data-redo9.7G 5.6G 3.7G 61% /redo
/dev/mapper/data-arch99G 32G 63G 34% /arch
/dev/mapper/data-app 50G 22G 26G 46% /app
/dev/mapper/temp-temp197G 389M 187G 1% /oradata/dbdg/temp
场景:db表空间使用率超过95%,需要添加数据文件。而dbdg磁盘空间无法支撑此次表空间扩容操作。两台数据库均使用本地磁盘。扩容只能采购。
方案:dbdg添加一块临时的机械磁盘,迁移TEMP表空间。为数据表空间腾出容量。
这就涉及到oracle dataguard架构配置TEMP的操作。具体操作如下:
#dbSQL> create temporary tablespace temp01 tempfile '/oradata/db/temp/temp_01.dbf' size 50m autoextend on next 50m maxsize 32767m extent management local;Database altered.SQL> alter database default temporary tablespace temp01;Database altered.SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP01SQL> select file_name,tablespace_name,autoextensible,maxbytes/1024/1024 MAX_MB from dba_temp_files;FILE_NAME TABLESPACE_NAME AUT MAX_MB
------------------------------------------------------------------ ------------------------------ --- ----------
/oradata/db/temp/temp_01.dbf TEMP01 YES 32767
/oradata/db/tmp01.dbf TMP YES 32767.9844
此时数据库的默认表空间已经切换为TEMP了。
#dbdg
SQL> select name,db_unique_name,open_mode from v$database;NAME DB_UNIQUE_NAME OPEN_MODE
--------- ------------------------------ --------------------
DB dbdg READ ONLY WITH APPLYSQL> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP01 SQL> select file_name,tablespace_name,autoextensible,maxbytes/1024/1024 MAX_MB from dba_temp_files;FILE_NAME TABLESPACE_NAME AUT MAX_MB
------------------------------------------------------------------ ------------------------------ --- ----------
/oradata/dbdg/tmp01.dbf TMP YES 32767.9844
默认表空间配置已经同步到备库中的数据字典,但tempfile并没有创建成功。
核验操作系统文件
#db
[oracle@db01 temp]$ pwd
/oradata/db/temp
[oracle@db01 temp]$ ls
temp_01.dbf #dbdg
[oracle@dbdg temp]$ pwd
/oradata/dbdg/temp
[oracle@dbdg temp]$ ls
lost+found
备库数据字典中已经同步到配置了,但系统中却没有TEMP的数据文件。
#db&dbdg
SQL> show parameter standby_fileNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management string AUTO
standby_file_management也是自动的,主库创建文件的操作应该可以同步到备库,并成功执行的。然而事实并非如此。
通过查阅资料,需要手动在备库中添加TEMP数据文件
#dbdg
SQL> select name,db_unique_name,open_mode from v$database;NAME DB_UNIQUE_NAME OPEN_MODE
--------- ------------------------------ --------------------
DB dbdg READ ONLY WITH APPLYSQL> alter tablespace temp01 add tempfile '/oradata/dbdg/temp/temp_01.dbf' size 50m autoextend on next 50m maxsize 32767m;
alter tablespace temp01 add tempfile '/oradata/dbdg/temp/temp_01.dbf' size 50m autoextend on next 50m maxsize 32767m
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at line 62
返回错误,数据库为只读状态。
苦查资料无果的情况下,无意间查看了一下操作系统目录。发现备库的/oradata/dbdg/temp中竟然出现了temp_01.dbf的文件。
#dbdg
SQL> select file_name,tablespace_name,autoextensible,maxbytes/1024/1024 MAX_MB from dba_temp_files;FILE_NAME TABLESPACE_NAME AUT MAX_MB
------------------------------------------------------------------ ------------------------------ --- ----------
/oradata/dbdg/temp/temp_01.dbf TEMP01 YES 32767
/oradata/dbdg/tmp01.dbf TMP YES 32767.9844
备库中的dba_temp_files也增加了一条数据记录,新建临时表空间的文件信息。此时测试了备库查询也不在报无法找到临时表空间的错误了。
总结
tempfile和datafile、redologfile不同,tempfile和temp tablespace在DG环境下同步效果不好。在这次事件中甚至出现了没有文件对应的临时表空间。而在备库以read only with apply模式打开后,执行文件添加命令。虽然报错,但文件系统中确实出现了对应的tempfile。其中原理还需进一步研究。