一、概述
我一般都是用runInstaller和dbca的图形界面安装Oracle,但是这次安装加数据迁移,受到网络限制,不能用弹出窗口,只能用静默方式,还是使用 runInstaller 可执行程序,不过要加一个 -silent 选项,参考了网上的文章,加上自己的实际情况,总结这次Oracle19c的静默安装,包括四部分:
1、runInstaller 静默安装19c软件包
2、netca静默配置网络
3、dbca静默建库
4、导入表结构和数据
二、runInstaller 静默安装软件19c软件包
这一步包括安装前的准备,安装19c至少需要两个包:
oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
这一步参考我之前的文章:安装 Oracle 19c_oracle个人使用收费吗-CSDN博客
建用户组、用户与那篇文章中相似,只是这次发现可以精简一些,因为这次安装的Oracle要求不高,只是作为演示,没有什么复杂的用户和权限的分工(以root用户操作):
# 预安装
rpm -ivh oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
# 只建一个用户组
groupadd -g 54321 oinstall
# 创建oracle用户并加到这个用户组
useradd -u 54321 -g oinstall oracle
# 如果之前创建过oracle或oinstall,最好先删除
然后创建目录:
mkdir -p /u01/app
chown -R oracle:oinstall /u01/app
chmod -R 775 /u01/app
mkdir -p /u01/app/oraInventory
chown -R oracle:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oraInventory
mkdir -p /u01/app/oracle/cfgtoollogs
mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/app/oracle
然后在oracle用户的 .bash_profile文件中,加入环境变量:
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.3.0/dbhome_1
export ORACLE_SID=platdb
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
接下来是解压
LINUX.X64_193000_db_home.zip
到 $ORACLE_HOME目录下(以oracle用户执行,注意:一定要解压到$ORACLE_HOME下,更多细节看上面那篇文章)
unzip LINUX.X64_193000_db_home.zip -d $ORACLE_HOME
之后就是图形安装和静默安装的区别了,图形安装见我上面那篇文章,静默安装就是把在图形界面的选项写在response文件里。
大道至简,静默安装的命令如下(以oracle用户执行):
./runInstaller -silent -noconfig -ignorePrereq -responseFile ~/db_install.rsp
-noconfig 表示忽略response文件中的configure部分
-ignorePrereq 表示不做预检查,因为在安装oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm时已经做了。
其中db_install.rsp就是配置项所在的response文件。
$ORACLE_HOME/install/response/db_install.rsp 中有个模板,里面的注释很详细,可以拷贝出一份,尝试修改和执行,另外,-responseFile ~/db_install.rsp 最好使用绝对路径。
网上的文章,这一步还加了许多其它选项,我觉得没必要,上面就是最简洁有效的形式,许多命令行设置,都是可以写在db_install.rsp文件中的。
接下来就是关键的db_install.rsp文件怎么写,里面的参数基本和图形界面对应,静默安装oracle软件,相对比较简单,但dbca这一步会比较麻烦。
我的db_install.rsp文件内容如下,这里只有修改了的变量,其它变量都是默认值:
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=oinstall
oracle.install.db.OSOPER_GROUP=oinstall
oracle.install.db.OSBACKUPDBA_GROUP=oinstall
oracle.install.db.OSDGDBA_GROUP=oinstall
oracle.install.db.OSKMDBA_GROUP=oinstall
oracle.install.db.OSRACDBA_GROUP=oinstall
oracle.install.db.rootconfig.executeRootScript=false
oracle.install.db.rootconfig.configMethod=ROOT
我的配置是Enterprise Edition,只安装软件,组和用户模型只用了oinstall组,oracle用户属于这个组,我觉得其它操作系统用户组,对于我的这种简单管理模型,是不必要的。
然后执行runInstaller,执行过程中,可能会有一些坑,我是在 OpenEuler 上安装的,下面就是我遇到的坑:
1、需要修改 $ORACLE_HOME/cv/admin/cvu_config 中的变量 CV_ASSUME_DISTID=BCL21,因为 Oracle 不能识别 OpenEuler 的操作系统名,所以这里要显式设置 CV_ASSUME_DISTID,值其实可以随便设置,这个问题参考这篇帖子:
2、提示找不到库 -lclntshcore,这个库是在 $ORACLE_HOME/lib 下的 libclntshcore.so.19.1 软链接,可以拷贝一份放到 /usr/lib64 下面,软链接也可以。
3、报缺少静态库 libpthread_nonshared.a ,也不用安装,参考
glibc缺少静态库libpthread_nonshared.a导致Oracle数据库安装失败 · Issue #I5F6U6 · src-openEuler/glibc - Gitee.com
只要
ar cr /usr/lib64/libpthread_nonshared.a
生成一个空的静态文件,就可以了,至于为啥,我也不知道!
以上就是Oracle19c的静默安装,总操作框架就是如此,具体实施可能有细微差别。
这只是安装完软件,还没有建库,建库用dbca,也是静默模式。
我参考了网上一篇文章,步骤是:runInstaller安装软件(静默) => netca配置网络(静默) => dbca建库(静默),我觉得挺合理,所以下一步是用netca配置网络。
二、netca 静默配置网络
netca 和 dbca 类似,静默模式也是 -silent 选项再加 response 文件,操作关键是 response 文件的设置,它有一个初始模板在 $ORACLE_HOME/assistants/netca/netca.rsp 。
配置 netca 好处是,这个模板可以不加任何修改,使用默认值就行。
我使用的netca命令如下:
netca -silent -responsefile ~/netca.rsp
然后 lsnrctl status 查看一下状态,应该有 no services 因为数据库还没有建。
三、dbca 静默建库
dbca -silent -createDatabase -responseFile ~/dbca.rsp
dbca 的 response 文件的模板在 $ORACLE_HOME/assistants/dbca/dbca.rsp,里面的注释很详细清晰,下面只有我修改的变量,我的配置是非容器化,单实例,是最简单的配置:
responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v19.0.0
gdbName=platdb
sid=platdb
databaseConfigType=SI
policyManaged=false
createServerPool=false
force=false
createAsContainerDatabase=false
numberOfPDBs=0
templateName=/u01/app/oracle/product/19.3.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc
sysPassword=Paas1015
systemPassword=Paas1015
emConfiguration=DBEXPRESS
emExpressPort=5500
omsPort=0
storageType=FS
characterSet=ZHS16GBK
nationalCharacterSet=AL16UTF16
listeners=LISTENER
variables=ORACLE_BASE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1, ORACLE_BASE=/u01/app/oracle, PDB_NAME=, DB_NAME=platdb, ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1, SID=platdb
initParams=undo_tablespace=UNDOTBS1, sga_target=10093MB, db_block_size=8192BYTES, nls_language=AMERICAN, diagnostic_dest={ORACLE_BASE}, control_files=("{ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/control01.ctl", "{ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME}/control02.ctl"), remote_login_passwordfile=EXCLUSIVE, audit_file_dest={ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump, processes=1500, nls_territory=CHINA, memory_target=0, SGA_TARGET=800MB,PGA_AGGREGATE_TARGET=200MB, db_recovery_file_dest_size=50GB, open_cursors=300, shared_pool_size=1G, compatible=19.0.0, db_name=platdb, db_recovery_file_dest={ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME}, audit_trail=db
sampleSchema=false
memoryPercentage=40
databaseType=MULTIPURPOSE
automaticMemoryManagement=false
totalMemory=0
需要注意的是,这三项配置,应该与要迁移的目标数据库相同:
characterSet=ZHS16GBK
nationalCharacterSet=AL16UTF16
listeners=LISTENER
其中 gdbName、sid为了简单,都设置为相同的名字:platdb
至于 variables 和 initParams 中的参数,我感觉并没有生效,这些可以等数据库建好后再设置,尤其是内存相关的参数。
其中
templateName=/u01/app/oracle/product/19.3.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc
这个设置了默认数据文件、控制文件、redo文件的位置和大小,这些信息存储在模板文件General_Purpose.dbc中,可以通过修改General_Purpose.dbc来改变这些设置。
dbca完成建库后,会启动数据库,这时已经创建了SYS和SYSTEM用户,可以 sqlplus / as sysdba 登录,然后查看数据库状态:
select instance_name, status from v$instance ;
dbca建库启动是用的spfile,这时可以修改一些内存设置参数,并存储到spfile。
我的机器内存有128G,我开启了(Automatic Shared Memory Management),开启这个设置,只需要设置和保存 sga_target、pga_aggregate_target 两个参数,而 memory_target 和memory_max_target 设为 0,然后重启:
# 关闭 AMM
alter system set memory_max_target = 0M scope=spfile;
alter system set memory_target = 0M scope=spfile;# 开启 ASMM
# sga_target 一般配置为物理内存的30%到70%之间;
# pga_aggregate_target 一般配置为物理内存的5%到25%之间;
# sga_target 和pga_aggregate_target 之和不要超过物理内存的80%;alter system set sga_max_size=70G scope=spfile;
alter system set sga_target=60G scope=spfile;
alter system set pga_aggregate_target=5G scope=spfile;# ASMM 可另外设置 sga 中的 shared_pool_size不小于1G
alter system set shared_pool_size=1G scope=spfile;
关于 oracle 内存管理参数的配置,这篇帖子讲的很清晰:Oracle数据库查看与修改内存配置_oracle内存分配与调整-CSDN博客
之前搜了网上那么多文章都没说明白,包括Oracle的官方文档,而这篇讲的清晰明了简洁。
最好把spfile备份为pfile,遇到过参数设置错,数据库无法启动,此时可以修改一下备份的pfile,再启动,这样可以保存之前spfile的大部分设置:
create pfile from spfile
关于启动时spfile和pfile参考我的文章:OCP 体系结构_ocp架构服务器-CSDN博客 -> 参数文件
数据库启动后查看以下网络服务:
lsnrctl status
tnsnames.ora配置(给客户端用,可选):
YUNPAAS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 36.133.172.224)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = platdbXDB)
)
)
Windows下的PL/SQL Developer连接数据库配置参考我的文章:
Windows安装PL/SQL Developer_windows安装plsql-CSDN博客
另外,如果失败,可以用dbca删除数据库,然后再建库(不必担心重复操作的副作用),dbca删除数据库用命令:
dbca -silent -deleteDatabase -sourceDB platdb
这里platdb是就是sid也是数据库名,dbca是希望数据库运行时执行删库的,但是需要删库的时候,常常是因为数据库起不来了,此时删库还要手动删除数据文件所在目录和fast_recovery_area等。
四、创建用户和导入数据
# 创建表空间
create tablespace PAAS datafile '/u01/app/oracle/oradata/PLATDB/paas.dbf' size 2048m autoextend on next 2048m maxsize 30G;
# 创建用户
create user paasapp identified by Paas1015 default tablespace paas;
grant connect, resource to paasapp;
grant create session to paasapp;
grant dba to paasapp ;
grant imp_full_database to paasapp;
grant exp_full_database to paasapp;
alter user paasapp quota unlimited on paas;
sqlplus新用户连接数据库:
sqlplus paasapp/Paas1015@platdb
关于客户端连接Oracle数据库的详细讨论,参考我的文章:Oracle 网络配置_protocol = ipc-CSDN博客
这一步是可选的,我的项目类似迁移项目,需要在新数据库上,创建另一个数据库对应的用户、表空间、导入表结构和数据,之所以在这里记录,是因为遇到了一个问题,就是从其它Oracle导出的表定义和insert脚本,导入新数据库后,出现中文乱码。
关于Oracle的字符集等配置,之前总结过,但是很久不用忘记了 OCP Oracle全球化与字符集_al16utf16 gb18030-CSDN博客
之前的知识并没有解决这里的问题,一开始是猜测导出的sql脚本编码问题,用notepad++转为utf-8编码,在vim中打开,中文确实能正常显示,但是用sqlplus导入后,查询数据库,中文仍然是乱码。
在公司DBA的提示下,根据数据库的NLS_LANGUAGE、NLS_TERRITORY、NLS_CHARACTERSET配置,对应的设置环境变量设置了NLS_LANG为 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,再导入SQL脚本(未转为utf8),这次查询中文不是乱码了!
看来关键是NLS_LANG环境变量,尤其是在使用sqlplus时,很重要!
参考
以下三个连接,静默安装三部曲,写的清晰简洁
RunInstaller 19c Silent Mode - How to SOP
How to Run NETCA in Silent Mode - How to SOP