来看看 发表于 2017-6-21 15:26:46

Hyper-V安装Oracle Linux6

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


Windows服务器增加Hyper-V功能


[*]打开服务器管理器
[*]在仪表板界面,添加角色和功能
[*]找到Hyper-V之后下一步直至安装完成
执行安装Linux


[*]打开Hyper-V管理器
[*]点击右边栏"虚拟交换机管理器",创建一个内部类型的虚拟交换机(相当于VMware的NAT)
[*]创建完成后,打开控制面板的网络连接,可以看到我们新建的虚拟机交换机。



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



[*]操作-> 新建 -> 虚拟机,将虚拟交换机选成上面新建的NAT,加载iso文件到光驱。
[*]配置项选完以后,重新启动就从光驱引导开始安装了,这里面的安装步骤就省略了。
[*]安装完成后,再次进入系统可能发现网卡硬件不存在,如果安装了桌面那么鼠标也不能使用。原因是HyperV相对其他虚拟机软件器驱动程序没有那么丰富。要实现这些虚拟硬件需要额外安装微软的Linux Integration Services,而且此软件对于6.4版本只支持Redhat和CentOS,幸好Oracle Enterprise Linux版本支持用Redhat内核启动。
[*]修改/boot/grub/grub.conf文件,配置default=1使默认从Redhat内核启动,同时可以参照另一篇文章关闭numa,避免启动时黑屏。如果是GUI界面的话,可以通过点操作-> 触发一个Ctrl+Alt+Delete到桌面,选择Cancel,然后就可以使用键盘按C打开Computer,后面可以打开一个路径并且选择File中的open in terminal从而打开shell终端进行修改了。配置完成以后重启一下系统。
[*]从微软的网站下载相应的Linux Integration Services,通过媒体-> DVD驱动器-> 插入下载的iso文件,用上文中的Ctrl+Alt+Delete方式使用键盘打开shell,进去光盘路径找到REDHAT64,使用./install.sh安装LIS,安装完成之后再重启一下系统。
[*]  再次进入系统后,就可以使用鼠标了,并且网卡硬件也加载了。然后配置/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"

[*]关闭防火墙和SELINUX,具体方法请搜索。
[*]  然后重启下网络,service network restart,使用putty测试是否能够使用ssh 192.168.5.2登陆。

增加硬盘


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



[*]格式化sdb成8e格式LVM形式



[*]解决'Partition 1 does not start on physical sector boundary.'参考问答
[*]使用partprobe使分区表生效
[*]使用pvcreate将分区转换为LVM可用的分区



[*]使用vgcreate创建卷组,后面可以使用vgextend进行扩展



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



[*]进行逻辑卷格式化并挂载。

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


[*]编辑/etc/fstab,使挂载持久化。



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



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



[*]格式化为ext4格式mkfs -t ext4 /dev/sdb2
[*]使用vgextend将pv扩展到vg



[*]使用lvextend将新增容量都放到lv中



[*]使用resize2fs使新增空间可用


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


安装Oracle 12C Database


[*]使用pscp将安装文件'linuxamd64_12102_database_1of2.zip'和'linuxamd64_12102_database_2of2.zip'上传至虚拟机
[*]依次解压两个zip文件,可以将所有的安装文件解压至database目录
[*]  先将NAT的地址放到/etc/hosts文件
# 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

[*]因为是内网环境,不能使用网络yum源,只能用安装光盘搭载一个本地的yum源。  
本地源的搭建方法,可以参考Linux软件安装管理5 挂载本地iso光盘镜像、配置yum软件仓库

[*]  修改"/etc/sysctl.conf"文件,需要增加或者修改的参数如下。
  

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>  
```


[*]因为是虚拟机,直接使用虚拟机管理连接登陆图形界面,使用oracle用户执行./runInstaller,就可以出现图形化安装界面。



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



[*]安装完成后可以通过"/u1/app/oraInventory/logs/installActions.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.ziplinuxamd64_12102_database_2of2.ziplis4-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的情况下启动。  
```sql
  
$ rman target /


  Recovery Manager:>  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>
  
Variable>  
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状态
  
```sql
  
$ sqlplus / as sysdba


  SQL*Plus:>  Copyright (c) 1982, 2014, Oracle. All rights reserved.
  Connected to:

  
Oracle Database 12c Enterprise Edition>  
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>
  
Variable>  
Database Buffers 771751936 bytes
  
Redo Buffers 13848576 bytes
  
```


[*]设置DBID,并恢复control文件  
```sql
  
$ rman target /


  Recovery Manager:>  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状态  
```sql

  
RMAN>>
  Statement processed
  
released channel: ORA_DISK_1
  
```


[*]注册rman文件备份集,使用shell脚本快速生成catalog命令  
``sqlfor file inls -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
  
```


[*]删除之前配置的默认通道  
```sql
  
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
  
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 datafile1to '/u1/app/oracle/oradata/TESTDB/system01.dbf';
  
set newname for datafile2to '/u1/app/oracle/oradata/TESTDB/system02.dbf';
  
set newname for datafile3to '/u1/app/oracle/oradata/TESTDB/sysaux01.dbf';
  
set newname for datafile4to '/u1/app/oracle/oradata/TESTDB/undotbs01.dbf';
  
set newname for datafile5to '/u1/app/oracle/oradata/TESTDB/undotbs02.dbf';
  
set newname for datafile6to '/u1/app/oracle/oradata/TESTDB/users01.dbf';
  
set newname for tempfile1to '/u1/app/oracle/oradata/TESTDB/temp01.dbf';
  
set newname for tempfile2to '/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
  
SQL> select member from v$logfile;

MEMBER
  +DATADG/TESTDB/redo02.log
  
+DATADG/TESTDB/redo01.log
  
+DATADG/TESTDB/redo03.log
  
+DATADG/TESTDB/redo04.log

  SQL>>
  Database>  -- 从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:>  -- 在新文件中修改下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'>
  
GROUP 2 '/u1/app/oracle/oradata/TESTDB/redo02.log'>  
-- 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>>
  
2 group 3 '/u1/app/oracle/oradata/TESTDB/redo03.log'>
  
3 group 4 '/u1/app/oracle/oradata/TESTDB/redo04.log'>  
```


[*]使用resetlogs打开数据库  
```sql

  
SQL>>

  Database>  
```


[*]因为RMAN不会重建临时表空间,需要手动建一下临时表空间  
```sql

  
SQL>>

  Tablespace>
  SQL>>
  Tablespace>  
```


[*]清除未使用的redo日志组,其实正好是上面添加的redo文件  
```sql
  
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 NOCURRENT
  3       2 YES INACTIVE
  4       2 YES INACTIVE
  


  SQL>>
  Database>
  SQL>>
  Database>
  SQL>>
  Database>  
```


[*]删除多余的undo文件  
```sql
  
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--
页: [1]
查看完整版本: Hyper-V安装Oracle Linux6