背景: 对主备机的物理内存扩容一倍,内存扩容后,需要修改数据库相关的内存参数,包括数据库层面和操作系统层面。预计对备机扩容一倍内存操作完毕后,修改相关内存参数,将数据库启动到备机,运行2天,若没有问题,再对之前的主机物理内存扩容一倍,将数据库切换到备机。之所以这么做,是因为扩容操作,需要关闭操作系统,一晚上搞不定,所以分两次操作,同时也可以更好的确保,主备机在内存扩容和修改相关数据库参数后,都可以正常运行。
环境介绍:
双机操作系统:solaris 10数据库版本:oracle 11g R1 64bit当前主机的hostname和IP: fly-db1 192.168.20.20当前备机的hostname和IP: fly-db2 192.168.20.21物理内存,扩容前94G,扩容后188G
1、确认数据库的内存管理方式:手动管理
SQL> show parameter memory_targetNAME TYPE VALUE------------------------------------ ----------- -------memory_target big integer 0SQL> show parameter sga_targetNAME TYPE VALUE------------------------------------ ----------- -------sga_target big integer 0
2、查看当前spfile路径:采用共享存储
SQL>show parameter spfile <--- 如果采用的是共享存储,spfile真实的保存位置在存储上。<---如果显示的是/XXX/XXX/dbs/spfile_SID.ora 可通过strings命令查看内容来确定真正的spfile路径。
3、刚已确认数据库的参数文件采用共享存储,则数据库的所有文件(控制文件,在线日志,数据文件(数据表空间和临时表空间的数据文件),参数文件)均应该为裸设备,现需确认主备机数据库的这些文件确实为裸设备,以及权限均为:oracle:oinstall或者oracle:dba,以避免双机切换过程中,因为数据库的文件权限不正确或使用到文件系统的数据文件导致切换失败(之前遇到过这种情况,所以需要再次确认)
bash-3.00$ hostnamefly-db1bash-3.00$ cat check_file.sql //在当前主机运行以下SQL,查询所有数据库文件,保存到文本oracle_131215.txtset heading offset echo offset newpage noneset feedback offspool oracle_131215.txtselect file_name from dba_data_files;select file_name from dba_temp_files;select member from v$logfile;select name from v$controlfile;select value from v$parameter where name='spfile';spool offbash-3.00$ sqlplus /nologSQL> conn /as sysdbaConnected.SQL> @check_file.sqlSQL> quitbash-3.00$ lscheck_file.sql oracle_131215.txtbash-3.00$ for i in $(cat oracle_131215.txt);do ls -l $i;done //查看这些文件(有省略)是否为裸设备(即字符设备),权限是否正确crw------- 1 oracle dba 342, 200 Dec 15 07:39 /dev/raw/raw1crw------- 1 oracle dba 342, 201 Dec 15 02:57 /dev/raw/raw2crw------- 1 oracle dba 342, 202 Dec 15 03:04 /dev/raw/raw3crw------- 1 oracle dba 342, 254 Dec 15 01:22 /dev/raw/raw4crw------- 1 oracle dba 342, 253 Dec 15 03:25 /dev/raw/raw5bash-3.00$ for i in $(cat oracle_131215.txt);do ls -l $i | grep -v ^c;done //若文件个数太多,则刷选开头不是c打头的文件,若无输出,即均为裸设备bash-3.00$ for i in $(cat oracle_131215.txt);do ls -l $i | grep root;done //刷选是否有root字眼的文件,文件创建时,默认为root:rootbash-3.00$ scp oracle_131215.txt oracle@192.168.20.21:/home/oracle/ //在备机执行一样的操作Password:oracle_131215.txt 100% |*********************************************************************************| 27216 00:00bash-3.00$ ssh oracle@192.168.20.21Password:Last login: Sun Dec 15 10:31:13 2013 from 192.168.20.20ONLY Authorized users only! All accesses loggedfly-db2% bashbash-3.00$ hostnamefly-db2bash-3.00$ for i in $(cat oracle_131215.txt);do ls -l $i;donecrw------- 1 oracle dba 342, 200 Sep 15 2012 /dev/raw/raw1crw------- 1 oracle dba 342, 201 Sep 15 2012 /dev/raw/raw2crw------- 1 oracle dba 342, 202 Sep 15 2012 /dev/raw/raw3crw------- 1 oracle dba 342, 254 Sep 15 2012 /dev/raw/raw4crw------- 1 oracle dba 342, 253 Sep 15 2012 /dev/raw/raw5bash-3.00$ for i in $(cat oracle_131215.txt);do ls -l $i | grep -v ^c;donebash-3.00$ for i in $(cat oracle_131215.txt);do ls -l $i | grep root;done
4、确认需要修改的参数:
在主备机修改/etc/system文件中的以下参数为以下值,:(shmsys:shminfo_shmmax为共享内存段的最大值,一般为物理内存的一半,精确到字节)set shmsys:shminfo_shmmax=100931731456将以下数据库参数修改为以下值:memory_max_target=110G //物理内存的60%sga_max_size=110G //物理内存的60%db_cache_size=55G //物理内存的30%shared_pool_size=10G //物理内存的5%pga_aggregate_target=18G //物理内存的10%db_files=2000 //数据库的数据文件个数限制修改为2000processes=3000 //当前该值已经很大,不再修改
具体的操作步骤如下:
1、主备机的/etc/system文件必须一致,否则将备机的shmsys:shminfo_shmmax参数修改后,重启备机操作系统生效该参数时,将失败,/etc/system文件只有在操作系统引导时,才会被读取,理论上,在数据库运行时,是可以修改/etc/system文件的shmsys:shminfo_shmmax参数的
2、修改主备机的/etc/system文件中的shmsys:shminfo_shmmax参数为物理内存(188G)的一半,精确到字节。set shmsys:shminfo_shmmax=100931731456
3、对比主备机的/etc/system文件是否一致,无任何输出,则一致
bash-3.00#hostnamefly-db1bash-3.00# diff /etc/system /home/oracle/system_flydb2_131215.bak
4、重启备机操作系统,生效该参数的设置
bash-3.00# hostnamefly-db1bash-3.00# syncbash-3.00# syncbash-3.00# syncbash-3.00# shutdown -i6 -g0 -y
5、通过spfile创建pfile,备份一份pfile文件到/home/oracle/bak目录下(注意不要备份到/tmp目录下,操作系统重启后,/tmp目录下的文件会被清空,在该操作系统,/tmp的文件系统类型为swap(可通过df -h看出),即/tmp其实指的是内存,你在/tmp目录下存3G大小的文件,会发现,内存的使用增长了相应的大小,当操作系统重启后,/tmp目录下的文件是会消失的),同时下载一份到本地,该pfile为未做任何修改,用于回滚操作使用
SQL>create pfile='/home/oracle/pfile_131215.ora' from spfile;bash-3.00$ cp /home/oracle/pfile_131215.ora /home/oracle/bak/
6、以sys登陆数据库,修改以下参数:
bash-3.00$sqlplus /nologSQL> conn /as sysdbaSQL>alter system set memory_max_target=110G scope=spfile;SQL>alter system set sga_max_size=110G scope=spfile;SQL>alter system set db_files=2000 scope=spfile;
7、通过spfile再次备份pfile(注意该pfile为修改了memory_max_target,sga_max_size,db_files参数之后的参数文件):
SQL>create pfile='/home/oracle/pfile_1215_xiugai.ora' from spfile;bash-3.00$ cp /home/oracle/pfile_1215_xiugai.ora /home/oracle/bak
8、删除该pfile文件中最上面的关于当前内存参数值内容部分(sid._*),在我这的pfile,删除以下值
fly.__db_cache_size=31138512896fly.__java_pool_size=268435456fly.__large_pool_size=268435456fly.__pga_aggregate_target=5368709120fly.__sga_target=48318382080fly.__shared_io_pool_size=0fly.__shared_pool_size=15837691904fly.__streams_pool_size=536870912
9、在pfile中更改参数为以下的值:
*.db_cache_size=55G*.pga_aggregate_target=18G*.shared_pool_size=10G
10、在双机软件中,点击进入维护模式,然后关闭监听,关闭数据库
bash-3.00$hostnamefly-db1bash-3.00$lsnrctl stopbash-3.00$sqlplus /nologSQL>conn /as sysdbaSQL>alter system checkpoint;SQL>alter system switch logfile;SQL>alter system switch logfile;SQL>alter system switch logfile;SQL>alter system switch logfile;SQL>shutdown immediate;
11、在主机fly-db1通过pfile重建spfile
SQL>create spfile from pfile='/home/oracle/pfile_1215_xiugai.ora';或者直接指定裸设备的路径重建spfileSQL>create spfile='/dev/raw/raw1' from pfile='/home/oracle/pfile_1215_xiugai.ora';
12、因为双机软件,无法在维护模式下,将在主机已经关闭的数据库直接启动到备机fly-db2(备机物理内存已扩容到188G,主机的物理内存仍为之前的94G),双机软件必须在数据库启动的情况下,才能将数据库切换到另外一台主机,但spfile已经修改,这时候,如果直接startup启动数据库,数据库必然报out of memory的错误,原以为双机可以直接将数据库启动到备机,这是操作时,没有想到的问题,那么,我们可以通过我们最初备份的pfile,通过pfile启动数据库,然后再通过双机软件将数据库切换到另外一台主机,来解决这个问题
bash-3.00$sqlplus /nologSQL>conn /as sysdbaSQL>startup pfile='/home/oracle/pfile_131215.ora';
13、在主机fly-db1启动数据库后,通过双机软件,退出维护模式,将数据库启动到备机fly-db2
14、观察alert日志是否有错误信息,通过spfile创建pfile或者生成awr报告,观察以上设置是否生效。通过以下SQL,查看当前的参数设置:
SQL>select name, value, display_valuefrom v$parameter twhere t.name in ('memory_max_target','memory_target','sga_max_size','sga_target','shared_pool_size','db_cache_size','pga_aggregate_target','db_files');