Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

时间:2021-03-24 05:40:24

本文记录在Windows Server 2012 R2上安装Oracle Enterprise Linux 6.4以及使用RMAN进行进行异机恢复的过程。

Windows服务器增加Hyper-V功能

  1. 打开服务器管理器
  2. 在仪表板界面,添加角色和功能
  3. 找到Hyper-V之后下一步直至安装完成

执行安装Linux

  1. 打开Hyper-V管理器

  2. 点击右边栏"虚拟交换机管理器",创建一个内部类型的虚拟交换机(相当于VMware的NAT)

  3. 创建完成后,打开控制面板的网络连接,可以看到我们新建的虚拟机交换机。

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  4. 打开虚拟适配器的属性,将"Internet 协议版本4"的属性设置成固定地址。

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  5. 操作-> 新建 -> 虚拟机,将虚拟交换机选成上面新建的NAT,加载iso文件到光驱。

  6. 配置项选完以后,重新启动就从光驱引导开始安装了,这里面的安装步骤就省略了。

  7. 安装完成后,再次进入系统可能发现网卡硬件不存在,如果安装了桌面那么鼠标也不能使用。原因是HyperV相对其他虚拟机软件器驱动程序没有那么丰富。要实现这些虚拟硬件需要额外安装微软的Linux Integration Services,而且此软件对于6.4版本只支持Redhat和CentOS,幸好Oracle Enterprise Linux版本支持用Redhat内核启动。

  8. 修改/boot/grub/grub.conf文件,配置default=1使默认从Redhat内核启动,同时可以参照另一篇文章关闭numa,避免启动时黑屏。如果是GUI界面的话,可以通过点操作-> 触发一个Ctrl+Alt+Delete到桌面,选择Cancel,然后就可以使用键盘按C打开Computer,后面可以打开一个路径并且选择File中的open in terminal从而打开shell终端进行修改了。配置完成以后重启一下系统。

  9. 从微软的网站下载相应的Linux Integration Services,通过媒体-> DVD驱动器-> 插入下载的iso文件,用上文中的Ctrl+Alt+Delete方式使用键盘打开shell,进去光盘路径找到REDHAT64,使用./install.sh安装LIS,安装完成之后再重启一下系统。

  10. 再次进入系统后,就可以使用鼠标了,并且网卡硬件也加载了。然后配置/etc/sysconfig/network-scripts/ifcfg-eth1文件(因为我配置了两块网卡,用eth1连接的NAT地址)。

DEVICE=eth1
TYPE=Ethernet
UUID=9a98e87b-126d-4487-97ca-xxxxx15d7699
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
HWADDR=00:15:5D:58:09:04
IPADDR=192.168.5.2
NETMASK=255.255.255.0
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth1"

111111111111111121111111111111111. 关闭防火墙和SELINUX,具体方法请搜索。

111111111111111121111111111111111. 然后重启下网络,service network restart,使用putty测试是否能够使用ssh 192.168.5.2登陆。

增加硬盘

  1. 在Hyper-V管理器右侧操作栏选择新建-> 硬盘,为了提高性能使用固定容量的硬盘
  2. 关闭虚拟机,然后邮件虚拟机的设置项将硬盘添加到IDE控制器下面
  3. 登录系统,可以使用fdisk -l查看到新挂载的硬盘

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 格式化sdb成8e格式LVM形式

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 解决'Partition 1 does not start on physical sector boundary.'参考问答

  2. 使用partprobe使分区表生效

  3. 使用pvcreate将分区转换为LVM可用的分区

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  4. 使用vgcreate创建卷组,后面可以使用vgextend进行扩展

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  5. 使用lvcreate创建逻辑分区,可用lvextend进行扩展,且使用-l一次添加所有的extend

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  6. 进行逻辑卷格式化并挂载。

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

可以发现Filesystem栏的命名方式都为"/dev/mapper"加上"[vgname]-[lvname]"。

11. 编辑/etc/fstab,使挂载持久化。

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 可以通过touch一个文件,然后重启系统查看文件情况。
  2. 因为发现后面发现硬盘空间不够,这里采用扩展方式增加硬盘空间。

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 使用fdisk /dev/sdb将新增的容量分区到/dev/sdb2,按要求重启一次

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 格式化为ext4格式 mkfs -t ext4 /dev/sdb2
  2. 使用vgextend将pv扩展到vg

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 使用lvextend将新增容量都放到lv中

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  1. 使用resize2fs使新增空间可用

Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

可以参考网上文档,Linux LVM硬盘管理及LVM扩容

安装Oracle 12C Database

  • 使用pscp将安装文件'linuxamd64_12102_database_1of2.zip'和'linuxamd64_12102_database_2of2.zip'上传至虚拟机
  • 依次解压两个zip文件,可以将所有的安装文件解压至database目录
  • 先将NAT的地址放到/etc/hosts文件
[root@testbak u1]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.5.2 testbak.mytest.net testbak
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
  • 使用/sbin/sysctl -p使设置生效。
  • 添加以下内容至"/etc/security/limits.conf"
  • 手工安装以下包
yum install binutils -y
yum install compat-libcap1 -y
yum install compat-libstdc++-33 -y
yum install compat-libstdc++-33.i686 -y
yum install gcc -y
yum install gcc-c++ -y
yum install glibc -y
yum install glibc.i686 -y
yum install glibc-devel -y
yum install glibc-devel.i686 -y
yum install ksh -y
yum install libgcc -y
yum install libgcc.i686 -y
yum install libstdc++ -y
yum install libstdc++.i686 -y
yum install libstdc++-devel -y
yum install libstdc++-devel.i686 -y
yum install libaio -y
yum install libaio.i686 -y
yum install libaio-devel -y
yum install libaio-devel.i686 -y
yum install libXext -y
yum install libXext.i686 -y
yum install libXtst -y
yum install libXtst.i686 -y
yum install libX11 -y
yum install libX11.i686 -y
yum install libXau -y
yum install libXau.i686 -y
yum install libxcb -y
yum install libxcb.i686 -y
yum install libXi -y
yum install libXi.i686 -y
yum install make -y
yum install sysstat -y
yum install unixODBC -y
yum install unixODBC-devel -y
  • 创建用户和组
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
useradd -u 54321 -g oinstall -G dba,oper oracle
  • 修改"/etc/security/limits.d/90-nproc.conf"文件,修改后内容如下
* - nproc 16384
root soft nproc unlimited
  • 创建安装路径
mkdir -p /u1/app/oracle/product/12.1.0.2/db_1
chown -R oracle:oinstall /u1
chmod -R 775 /u1
  • 在"/home/oracle/.bash_profile"中增加以下内容
export TMP=/tmp
export TMPDIR=$TMP export ORACLE_HOSTNAME=testdb
export ORACLE_UNQNAME=TESTDB
export ORACLE_BASE=/u1/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2/db_1
export ORACLE_SID=TESTDB export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
  • 因为是虚拟机,直接使用虚拟机管理连接登陆图形界面,使用oracle用户执行./runInstaller,就可以出现图形化安装界面。

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  • 采用rman方式恢复数据库,所以只安装数据库软件。

    Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

  • 安装完成后可以通过"/u1/app/oraInventory/logs/installActions[date].log"查看安装日志

RMAN恢复数据库

准备备份文件

这部分内容参考"[三思笔记]RMAN管理ORACLE RAC数据库的备份与恢复"

  • 因为生产的RMAN备份在Linux服务器上,可以在Linux上mount本地windows的共享目录,然后把rman备份传输过来
# mount -t cifs -o username="administrator",password="test" //192.168.1.90/iso /db/windows
# cd /db/windows
# ls
linuxamd64_12102_database_1of2.zip linuxamd64_12102_database_2of2.zip lis4-0-11.iso
  • 使用find命令将指定时间范围内的备份文件拷贝到windows上,然后再用pscp上传至虚拟机
find ./ -mtime -6 -exec cp -f {} /db/windows/ \;
  • 使用awk和sort查看备份文件是否缺失
ls -l | awk -F"_" '{print $NF}' | sort

RMAN恢复

  • 连接rman并启动实例,首次可以在没有Pfile的情况下启动。
[oracle@testbak oracle]$ rman target /

Recovery Manager: Release 12.1.0.2.0 - Production on Thu Aug 11 09:19:54 2016

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

connected to target database (not started)

RMAN> startup nomount

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u1/app/oracle/product/12.1.0.2/db_1/dbs/initTESTDB.ora' starting Oracle instance without parameter file for retrieval of spfile
Oracle instance started Total System Global Area 1073741824 bytes Fixed Size 2932632 bytes
Variable Size 293601384 bytes
Database Buffers 771751936 bytes
Redo Buffers 5455872 bytes
  • 创建一个数据路径"$ORACLE_BASE/oradata/TESTDB",从备份集中恢复spfile并保存成pfile
restore spfile to pfile '/u1/app/oracle/oradata/pfile.ora' from '/u1/rmanbak/ctl_file_919512140_1_8223';
  • 手动修改导出的pfile文件,删除不符合单实例的内容。同时新建"/u1/app/oracle/fast_recovery_area/TESTDB/archivelog"和"/u1/app/oracle/admin/TESTDB/adump"目录
留下所有的*开头的行,其余的删除
另外删除*.cluster_database=TRUE
*.audit_file_dest='/u1/app/oracle/admin/TESTDB/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/u1/app/oracle/oradata/TESTDB/control01.ctl','/u1/app/oracle/oradata/TESTDB/control02.ctl'#Restore Controlfile
*.db_block_size=8192
*.db_domain=''
*.db_files=2000
*.db_name='TESTDB'
*.db_recovery_file_dest='/u1/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=21474836480
*.diagnostic_dest='/u1/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=TESTDBXDB)'
*.instance_number=2
*.log_archive_dest_1='LOCATION=/u1/app/oracle/fast_recovery_area/TESTDB/archivelog'
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=15000
*.pga_aggregate_target=500m
*.processes=1000
*.remote_login_passwordfile='exclusive'
*.sga_target=1500m
  • 使用sqlplus环境,通过上面的pfile创建spfile,并重启oracle到nomount状态
[oracle@testbak oracle]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Thu Aug 11 10:47:07 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> create spfile from pfile='/u1/pfile.ora'; File created. SQL> startup nomount
ORACLE instance started. Total System Global Area 1577058304 bytes
Fixed Size 2924832 bytes
Variable Size 788532960 bytes
Database Buffers 771751936 bytes
Redo Buffers 13848576 bytes
  • 设置DBID,并恢复control文件
[oracle@testbak oracle]$ rman target /

Recovery Manager: Release 12.1.0.2.0 - Production on Thu Aug 11 11:11:48 2016

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

connected to target database: TESTDB (not mounted)

RMAN> set dbid=1234567890

executing command: SET DBID

RMAN> restore controlfile from '/u1/rmanbak/ctl_file_919512140_1_8223';

Starting restore at 11-AUG-16
using channel ORA_DISK_1 channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u1/app/oracle/oradata/TESTDB/control01.ctl
output file name=/u1/app/oracle/oradata/TESTDB/control02.ctl
Finished restore at 11-AUG-16
  • 将数据库启动到mount状态
RMAN> alter database mount;

Statement processed
released channel: ORA_DISK_1
  • 注册rman文件备份集,使用shell脚本快速生成catalog命令
 for file in `ls -1`; do echo " catalog backuppiece '/u1/rmanbak/${file}';"; done

例子:
RMAN>
cataloged backup piece
backup piece handle=/u1/rmanbak/db_bak_lev1_919512113_1_8214 RECID=8305 STAMP=919597658
  • 删除之前配置的默认通道
RMAN>  configure channel 1 device type disk clear;

using target database control file instead of recovery catalog
old RMAN configuration parameters are successfully deleted RMAN> configure channel 2 device type disk clear; old RMAN configuration parameters are successfully deleted RMAN> configure device type disk clear; RMAN configuration parameters are successfully reset to default value
  • 获取源数据库中数据文件的路径
SQL> select file#,name from v$datafile;

FILE# NAME
----- ------------------------------------------------------------
1 +DATADG/TESTDB/system01.dbf
2 +DATADG/TESTDB/system02.dbf
3 +DATADG/TESTDB/sysaux01.dbf
4 +DATADG/TESTDB/undotbs01.dbf
5 +DATADG/TESTDB/undotbs02.dbf
6 +DATADG/TESTDB/users01.dbf SQL> select FILE#,NAME from v$tempfile; FILE# NAME
----- ------------------------------------------------------------
1 +DATADG/TESTDB/temp01.dbf
2 +DATADG/TESTDB/testtemp_01.dbf SQL> select member from v$logfile; MEMBER
--------------------------------------------------
+DATADG/TESTDB/redo02.log
+DATADG/TESTDB/redo01.log
+DATADG/TESTDB/redo03.log
+DATADG/TESTDB/redo04.log
  • 使用awk生成set newname命令
cat filenatest.txt | awk -F"[/+]" '{print "set newname for datafile "$1" to '\''/u1/app/oracle/oradata/TESTDB/"$NF"'\'';"}'
  • 编写如下脚本,然后执行数据还原。
rman cmdfile=restore.rman
restore.rman内容:
connect target sys/oracle
run{
set newname for datafile 1 to '/u1/app/oracle/oradata/TESTDB/system01.dbf';
set newname for datafile 2 to '/u1/app/oracle/oradata/TESTDB/system02.dbf';
set newname for datafile 3 to '/u1/app/oracle/oradata/TESTDB/sysaux01.dbf';
set newname for datafile 4 to '/u1/app/oracle/oradata/TESTDB/undotbs01.dbf';
set newname for datafile 5 to '/u1/app/oracle/oradata/TESTDB/undotbs02.dbf';
set newname for datafile 6 to '/u1/app/oracle/oradata/TESTDB/users01.dbf';
set newname for tempfile 1 to '/u1/app/oracle/oradata/TESTDB/temp01.dbf';
set newname for tempfile 2 to '/u1/app/oracle/oradata/TESTDB/testtemp_01.dbf';
restore database;
switch datafile all;
switch tempfile all;
}

switch命令作用是将新的数据文件路径写入control文件,用法可以参考rman备份恢复命令之switch

命令执行过程中会有如下提示:

input datafile copy RECID=56 STAMP=919619004 file name=/u1/app/oracle/oradata/TESTDB/system01.dbf

renamed tempfile 1 to /u1/app/oracle/oradata/TESTDB/temp01.dbf in control file

  • 然后使用recover database命令进行完全恢复
$ rman target /
RMAN > recover database;
--可以看到在使用lev1备份进行增量恢复
channel ORA_DISK_1: reading from backup piece /u1/rmanbak/db_bak_lev1_919512036_1_8202
channel ORA_DISK_1: piece handle=/u1/rmanbak/db_bak_lev1_919512036_1_8202 tag=DB_BAK_LEV1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00012: /u1/app/oracle/oradata/TESTDB/testdata_l1_02.dbf
destination for restore of datafile 00024: /u1/app/oracle/oradata/TESTDB/testdata_t30_01.dbf
destination for restore of datafile 00036: /u1/app/oracle/oradata/TESTDB/test_idx_t10_01
destination for restore of datafile 00038: /u1/app/oracle/oradata/TESTDB/testidx_t30_01.dbf
  • 过程中遇到错误,原因是只复制了备份机,没有应用源数据库的最新归档和Online redo文件,只能进行不完全恢复
unable to find archived log
archived log thread=2 sequence=7201
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR TESTSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 08/11/2016 20:27:33
RMAN-06054: media recovery requesting unknown archived log for thread 2 with sequence 7201 and starting SCN of 816203242
  • 现在数据文件和临时文件已经通过rman switch更新了位置,还有重做日志文件需要修改controlfile修改日志文件的路径
SQL> select member from v$logfile;

MEMBER
------------------------------------------------------------
+DATADG/TESTDB/redo02.log
+DATADG/TESTDB/redo01.log
+DATADG/TESTDB/redo03.log
+DATADG/TESTDB/redo04.log SQL> alter database backup controlfile to trace; Database altered. -- 从alert_TESTDB.log可以获取trace文件的位置
Fri Aug 12 08:49:26 2016
alter database backup controlfile to trace
Fri Aug 12 08:49:26 2016
Backup controlfile written to trace file /u1/app/oracle/diag/rdbms/testdb/TESTDB/trace/TESTDB_ora_9049.trc
Completed: alter database backup controlfile to trace -- 在新文件中修改下LOGFILE的位置,并去除RMAN的信息即可。
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS ARCHIVELOG
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 32
MAXLOGHISTORY 4672
2 3 4 LOGFILE
GROUP 1 '/u1/app/oracle/oradata/TESTDB/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u1/app/oracle/oradata/TESTDB/redo02.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u1/app/oracle/oradata/TESTDB/system01.dbf',
'/u1/app/oracle/oradata/TESTDB/system02.dbf',
'/u1/app/oracle/oradata/TESTDB/sysaux01.dbf',
'/u1/app/oracle/oradata/TESTDB/undotbs01.dbf',
'/u1/app/oracle/oradata/TESTDB/undotbs02.dbf',
'/u1/app/oracle/oradata/TESTDB/users01.dbf',
CHARACTER SET AL32UTF8
;
64 65 66
Control file created. -- 新增一组日志文件
SQL> alter database add logfile thread 2
2 group 3 '/u1/app/oracle/oradata/TESTDB/redo03.log' size 50m,
3 group 4 '/u1/app/oracle/oradata/TESTDB/redo04.log' size 50m;
  • 使用resetlogs打开数据库
SQL> alter database open resetlogs;

Database altered.
  • 因为RMAN不会重建临时表空间,需要手动建一下临时表空间
SQL> alter tablespace temp add tempfile '/u1/app/oracle/oradata/TESTDB/temp01.dbf' size 50m;

Tablespace altered.

SQL> alter tablespace TESTTEMP add tempfile '/u1/app/oracle/oradata/TESTDB/testtemp_01.dbf' size 50m;

Tablespace altered.
  • 清除未使用的redo日志组,其实正好是上面添加的redo文件
SQL> select thread#,status,enabled from v$thread;

THREAD# STATUS     ENABLED
------- ---------- ----------
1 OPEN PUBLIC
2 CLOSED PUBLIC SQL> col group for 99
SQL> select group#,thread#,archived,status from v$log; GROUP# THREAD# ARC STATUS
---------- ------- --- ----------
1 1 YES INACTIVE
2 1 NO CURRENT
3 2 YES INACTIVE
4 2 YES INACTIVE SQL> alter database disable thread 2; Database altered. SQL> alter database drop logfile group 3; Database altered. SQL> alter database drop logfile group 4; Database altered.
  • 删除多余的undo文件
SQL> select name from v$tablespace where name like 'UNDO%';

NAME
------------------------------
UNDOTBS1
UNDOTBS2 SQL> show parameter undo_tablespace; NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
SQL> drop tablespace undotbs2 including contents and datafiles; Tablespace dropped.

至此整套数据库环境搭建和数据恢复完成

--EOF--