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
;
注意:1,改为ARCHIVELOG;2,增加你的DBF文件,只增加*_DATA.DBF,*_TEMP.DBF不能在这添加
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)
)
)
-- 完 --