esxi上的一台oracle突然有一天无法访问网络,尝试重启主机,然而无果甚至最后连控制台也无法登录,里面有积累的好多数据。

因为硬件没有问题,所以考虑通过打开镜像找出里面的oracle物理文件,然后重装并恢复数据。

1、环境

esxi6.5、centos7、oracle11.2.0.4

2、问题解决

之前没有遇到过这个问题,所以按照网上说法,把vmdk文件下载,然后用diskgenius打开就能提取文件。但是因为文件过大(几百G),所以下载时间太长放弃,经过同事指点可以直接把vmdk挂到其他linux系统(这就是磁盘镜像数据)。

首先用相同的centos挂载,但是报错说:not found /dev/centos_boot,后来才知道这个分区它不认xfs,可我原始盘就是默认的xfs分区啊,因为了解的太少,所以更换ubuntu系统最终通过设置折腾最终挂上了。

挂载vmdk

1、用fdisk -l 命令查看新硬盘信息

fdisk -l 

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200   104857599    51379200   8e  Linux LVM

如果有新硬盘,可以看:sdb信息,centos7之后默认都是xfs分区,lvm就是xfs分区,这个比ext4分区要新。

但看有些文章说xfs分区有时候确实会出问题,不知道我这次是不是因为分区造成的。

sudo mount /dev/sdb1 /data  /挂载分区或执行如下

 

赶紧把盘里面的oracle目录完整拷贝出来,后续用于恢复。

一、安装oracle11.2.0.4



1、关闭防火墙

操作用户:root

systemctl stop firewalld.service
systemctl disable firewalld.service

2、安装依赖包

操作用户:root

yum install -y automake autotools-dev binutils bzip2 elfutils expat \
gawk gcc gcc-multilib g++-multilib lib32ncurses5 lib32z1 \
ksh less lib32z1 libaio1 libaio-dev libc6-dev libc6-dev-i386 \
libc6-i386 libelf-dev libltdl-dev libodbcinstq4-1 libodbcinstq4-1:i386 \
libpth-dev libpthread-stubs0-dev libstdc++5 make openssh-server rlwrap \
rpm sysstat unixodbc unixodbc-dev unzip x11-utils zlibc unzip cifs-utils \
libXext.x86_64  glibc.i686

注意:修改成一行粘贴到命令行

3、创建oracle用户

操作用户:root

groupadd -g 502 oinstall
groupadd -g 503 dba
groupadd -g 504 oper
groupadd -g 505 asmadmin
useradd -u 502 -g oinstall -G oinstall,dba,asmadmin,oper -s /bin/bash -m oracle
passwd oracle

4、解压安装文件

操作用户:oracle

操作目录:/home/oracle

unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip

5、修改系统参数

操作用户:root
操作文件:/etc/security/limits.conf

vim /etc/security/limits.conf

 在文件的末尾添加如下配置项。

oracle          soft      nproc   2047
oracle          hard      nproc   16384
oracle          soft      nofile  1024
oracle          hard      nofile  65536
oracle          soft      stack   10240

6、修改环境变量

操作用户:oracle
操作目录:/home/oracle

vim ~/.bash_profile

文件不存在可以创建,在/home/oracle文件夹下创建.bash_profile文件,在文件末尾添加如下配置项

export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl
export ORACLE_UNQNAME=orcl
export NLS_LANG=.AL32UTF8
export PATH=${PATH}:${ORACLE_HOME}/bin/:$ORACLE_HOME/lib

source .bash_profile

 7、修改oracle安装配置文件

操作用户:oracle
操作目录:/home/oracle

复制文件模板

cp /home/oracle/database/response/db_install.rsp .

注意:复制命令的最后一个 . 不能省略,表示将db_install.rsp文件从/home/oracle/database/response目录拷贝到当前目录。

对db_install.rsp文件进行编辑。

vim db_install.rsp

需要修改的配置项如下所示,这里,我将修改后的配置项列举出来。

oracle.install.option=INSTALL_DB_AND_CONFIG
ORACLE_HOSTNAME=localhost #实际上可以修改成你自己的主机名或者域名(IP)
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/home/oracle/tools/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/home/oracle/tools/oracle11g/product/11.2.0/dbhome_1
ORACLE_BASE=/home/oracle/tools/oracle11g
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=orcl
oracle.install.db.config.starterdb.SID=orcl
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=1024
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.password.ALL=Oracle#123456
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.dbcontrol.enableEmailNotification=false
oracle.install.db.config.starterdb.dbcontrol.emailAddress=test@qq.com #可以填写你自己的邮箱地址
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGE
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=/home/oracle/tools/oracle11g/oradata
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=/home/oracle/tools/oracle11g/fast_recovery_area
oracle.install.db.config.starterdb.automatedBackup.enable=false
DECLINE_SECURITY_UPDATES=true

 8、开始安装

操作用户:oracle
操作目录:/home/oracle/database

./runInstaller -silent -ignorePrereq -responseFile /home/oracle/db_install.rsp

接下来,就是默默的等待Oracle自行安装了,等待一段时间后,如果输出如下信息,则表明Oracle数据库已经安装成功。

The following configuration scripts need to be executed as the "root" user.
#!/bin/sh
#Root scripts to run

/home/oracle/tools/oraInventory/orainstRoot.sh
/home/oracle/tools/oracle11g/product/11.2.0/dbhome_1/root.sh
To execute the configuration scripts:

        1. Open a terminal window
         2. Log in as "root"
         3. Run the scripts
         4. Return to this window and hit "Enter" key to continue

Successfully Setup Software.

9、修改监听配置

编辑监听配置文件  /home/oracle/database/response/netca.rsp
修改以下参数

INSTALL_TYPE=""custom""                               # 安装的类型
LISTENER_NUMBER=1                                     # 监听器数量
LISTENER_NAMES={"LISTENER"}                           # 监听器的名称列表
LISTENER_PROTOCOLS={"TCP;1521"}                       # 监听器使用的通讯协议列表
LISTENER_START=""LISTENER""                           # 监听器启动的名称

执行命令:

$ /home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/netca -silent -responseFile /data/src/database/response/netca.rsp

查看监听程序是否运行

$ netstat -tnulp | grep 1521

开关监听

开启监听:
/data/oracle/product/11.2.0/db_1/bin/lsnrctl start
关闭监听:
/data/oracle/product/11.2.0/db_1/bin/lsnrctl stop

10、添加数据库实例

编辑数据库实例文件  /home/oracle/database/response/dbca.rsp
修改以下参数

RESPONSEFILE_VERSION ="11.2.0"                              // 不要变哦
OPERATION_TYPE ="createDatabase"                            // 操作为创建实例  
GDBNAME ="orcl"                                             // 数据库实例名
SID ="orcl"                                                 // 实例名字
TEMPLATENAME = "General_Purpose.dbc"                        // 建库用的模板文件
SYSPASSWORD = "oracle"                                      // SYS管理员密码
SYSTEMPASSWORD = "oracle"                                   // SYSTEM管理员密码
SYSMANPASSWORD= "oracle"
DBSNMPPASSWORD= "oracle"
DATAFILEDESTINATION =/data/oracle/oradata                   // 数据文件存放目录
RECOVERYAREADESTINATION=/data/oracle/flash_recovery_area    // 恢复数据存放目录
CHARACTERSET ="AL32UTF8"                                    // 字符集
NATIONALCHARACTERSET= "AL16UTF16"                           // 字符集
TOTALMEMORY ="1638"                                         // 1638MB,物理内存2G*80%。

 执行命令:

$ /data/oracle/product/11.2.0/db_1/bin/dbca -silent -responseFile /data/src/database/response/dbca.rsp

查看实例是否运行

$ ps -ef | grep ora_ | grep -v grep

修改启动和关闭实例的程序
修改文件:      /data/oracle/product/11.2.0/db_1/bin/dbstart
      /data/oracle/product/11.2.0/db_1/bin/dbshut

将
ORACLE_HOME_LISTNER=$1
修改为
ORACLE_HOME_LISTNER=/data/oracle/product/11.2.0/db_1

修改文件:  /etc/oratab

将
orcl:/data/oracle/product/11.2.0:N
修改为
orcl:/data/oracle/product/11.2.0:Y

启动或者关闭实例

启动实例:
/data/oracle/product/11.2.0/db_1/bin/dbstart
关闭实例:
/data/oracle/product/11.2.0/db_1/bin/dbshut

11、开机启动

root用户模式下:

# chmod +x /etc/rc.d/rc.local
修改文件 /etc/rc.d/rc.local
在文件最后追加以下内容:
su oracle -lc "/data/oracle/product/11.2.0/db_1/bin/lsnrctl start"
su oracle -lc "/data/oracle/product/11.2.0/db_1/bin/dbstart"

二、恢复数据

1、备份控制文件

以sysdba身份进行备份控件文件,备份目录自定义

[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Mon Nov 12 13:03:16 2018

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

SQL> alter database backup controlfile to trace as '/home/oracle/control_bak.trc'

Database altered.

2、停止数据库实例

SQL> shutdown immediate;
Database closed. Database dismounted. 
ORACLE instance shut down.

3、删除安装好的数据文件

因为要恢复老数据,所以新安装的空dbf和log文件都删掉,最好是把/home/oracle/app/oracle/oradata/orcl目录都删掉。然后把老数据orcl目录复制过来替换。

4、以sysdba身份启动到nomount

SQL> shutdown immediate; #先停止

SQL> startup nomount;

 5、修改并执行trace语句

把之前备份的控制文件里面的SQL部分拿出来执行,具体哪些看图:

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/home/oracle/app/oracle/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/home/oracle/app/oracle/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/home/oracle/app/oracle/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
DATAFILE
  '/home/oracle/app/oracle/oradata/orcl/system01.dbf',
  '/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
  '/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
  '/home/oracle/app/oracle/oradata/orcl/users01.dbf'
CHARACTER SET AL32UTF8
;

esxi主级如何查看电脑硬件情况 esxi查看硬盘信息命令_bc

 注意:1,改为ARCHIVELOG;2,增加你的DBF文件,只增加*_DATA.DBF,*_TEMP.DBF不能在这添加

esxi主级如何查看电脑硬件情况 esxi查看硬盘信息命令_bc_02

6、执行覆盖

执行完上面SQL语句后,执行以下命令执行覆盖

SQL> recover database;

7、打开数据库

SQL>alter database open;

8、补上临时表空间

ALTER TABLESPACE TEMP ADD TEMPFILE '/home/oracle/app/oracle/oradata/orcl/temp01.dbf' SIZE 30408704   REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

至此,数据恢复完成了。

三、监听程序配置备注

1、listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )
ADR_BASE_LISTENER = /home/oracle/app/oracle/

SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC =
   (GLOBAL_DBNAME = orcl)
   (SID_NAME = orcl)
   (ORACLE_HOME =/home/oracle/app/oracle/product/11.2.0/dbhome_1)
   )
 )

2、tnsnames.ora

orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

-- 完 --