一、知识普及

CDB到底是什么?
CDB全称为Container Database,即数据库容
器,PDB全称为Pluggable Database,即可插拔数据库。
CDB数据库容器由三部分组成:
**ROOT**: 又叫CDB$ROOT,存储数据库系统的元数据和公共用户,一般不建议在CDB$ROO下创建业务数据
**SEED**: 又叫PDB$SEED,这是创建pdb数据库的模板,一个CDB中只能有一个SEED,SEED中的对象无法添加和修改
**PDBS**: CDB中可以有一个或多个PDB
二、安装19C
使用一键安装脚本进行安装。
#!/bin/bash
#一键安装oracle数据库
#修改主机名
hostnamectl set-hostname myoracle
#添加主机名与IP对应记录
public_ip=$(hostname -I| grep -o -e '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' |head -n 1)
node_name=$(hostname)
echo -e "${public_ip} ${node_name}">> /etc/hosts
cat /etc/hosts
#关闭Selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
setenforce 0
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
# 获取当前所在目录位置
current_dir=$(pwd)
echo "当前所在目录位置: $current_dir"
# 目标路径
target_dir="/soft"
# 检查目标路径是否存在,如果不存在则创建
if [ ! -d "$target_dir" ]; then
mkdir -p "$target_dir"
echo "已创建目录: $target_dir"
fi
# 移动当前目录下的所有文件到目标路径
mv $current_dir/* $target_dir
echo "已将当前目录下所有文件移动至 $target_dir"
#添加离线yum源
cd soft
tar -xvf oracle_repo.tar.gz
cd soft/my_oracle_repo
rpm -ivh *.rpm --nodeps --force
#在线yum源
cd etc/yum.repos.d/
rm -rf ./*
sleep 20
wget -O etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#添加用户组及用户
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
useradd -u 54321 -g oinstall -G dba,backupdba,dgdba,kmdba,oper oracle
echo "oracle" | passwd --stdin oracle
id oracle
chmod 644 etc/sysctl.conf
#修改环境变量
cat <<EOF >>/etc/sysctl.conf
#ORACLE SETTING
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
kernel.panic_on_oops = 1
#(kernel.shmmax = 物理内存*1024*1024*1024-1)
kernel.shmmax = 2684354560
#控制共享内存页数(kernel.shmall = shmmax/4096)
kernel.shmall = 655360
#共享内存的最大数量
kernel.shmmni = 4096
#当系统内存使用90%的时候开始使用交换页面
vm.swappiness=10
#默认是100,增大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大。越容易回收。
vm.vfs_cache_pressure=200
EOF
sysctl -p
chmod 644 etc/security/limits.conf
cat <<EOF >>/etc/security/limits.conf
#ORACLE SETTING
#打开文件描述符大小
oracle soft nproc 16384
oracle hard nproc 16384
#单个用户可用的进程数
oracle soft nofile 16384
oracle hard nofile 65536
#进程堆栈段的大小
oracle soft stack 10240
oracle hard stack 32768
EOF
echo "none dev/shm tmpfs defaults,size=3096m 0 0" >> etc/fstab
mount -o remount dev/shm
chmod 644 etc/profile
cat <<EOF >>/etc/profile
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
EOF
source /etc/profile
mkdir -p /u01/app/oracle
mkdir -p /u01/app/oraInventory
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
mkdir -p /soft
mkdir -p /u01/app/oracle/fast_recovery_area
chown -R oracle:oinstall /u01
chown -R oracle:oinstall /soft
chmod -R 775 /u01
chmod -R 775 /soft
cat <<EOF >>/home/oracle/.bash_profile
#for oracle
umask=022
export PS1
export TMP=/tmp
export LANG=en_US.UTF8
export TMPDIR=$TMP
export ORACLE_UNQNAME=cdb19c
export ORACLE_SID=cdb19c
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_TERM=xterm
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"
export NLS_LANG=AMERICAN_AMERICA.UTF8
#export PATH=.:$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/bin
export THREADS_FLAG=native
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
export ORACLE_OWNR=oracle
export PATH=\$PATH:\$ORACLE_HOME/bin
EOF
source /home/oracle/.bash_profile
mv /soft/*.zip /u01/app/oracle/product/19.0.0/dbhome_1
cd /u01/app/oracle/product/19.0.0/dbhome_1
#解压oracle安装包
unzip LINUX.X64_193000_db_home.zip
mkdir -p /home/oracle/etc
chown -R oracle.oinstall /home/oracle/etc
cp /u01/app/oracle/product/19.0.0/dbhome_1/install/response/* /soft/
chmod 777 /soft/*.rsp
chown -R oracle:oinstall /soft
cat <<EOF >/soft/db_install.rsp
#软件版本信息
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
#安装选项-仅安装数据库软件
oracle.install.option=INSTALL_DB_SWONLY
#oracle用户用于安装软件的组名
UNIX_GROUP_NAME=oinstall
#oracle产品清单目录
INVENTORY_LOCATION=/u01/app/oraInventory
#oracle安装目录
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
#oracle基础目录
ORACLE_BASE=/u01/app/oracle
#安装版本类型:企业版
oracle.install.db.InstallEdition=EE
#指定组信息
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dgdba
EOF
chown -R oracle:oinstall /soft/db_install.rsp
chmod 660 /soft/db_install.rsp
chown -R oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1
#开始安装oracle软件
su - oracle -c "/u01/app/oracle/product/19.0.0/dbhome_1/runInstaller -silent -responseFile /soft/db_install.rsp"
sleep 200
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh
echo -e "\n\n****** start listener config ******\n\n"
cp /u01/app/oracle/product/19.0.0/dbhome_1/assistants/netca/netca.rsp /soft/
chmod 644 /soft/netca.rsp
cat <<EOF >>/soft/netca.rsp
[GENERAL]
RESPONSEFILE_VERSION="19.0"
CREATE_TYPE="CUSTOM"
[oracle.net.ca]
INSTALLED_COMPONENTS={"server","net8","javavm"}
INSTALL_TYPE=""typical""
LISTENER_NUMBER=1
LISTENER_NAMES={"LISTENER"}
LISTENER_PROTOCOLS={"TCP;1521"}
LISTENER_START=""LISTENER""
NAMING_METHODS={"TNSNAMES","ONAMES","HOSTNAME"}
NSN_NUMBER=1
NSN_NAMES={"EXTPROC_CONNECTION_DATA"}
NSN_SERVICE={"PLSExtProc"}
NSN_PROTOCOLS={"TCP;HOSTNAME;1521"}
EOF
sleep 60
#开始安装监听
su - oracle -c "/u01/app/oracle/product/19.0.0/dbhome_1/bin/netca -silent -responsefile /soft/netca.rsp"
echo -e "\n\n****** listener config completed ******\n\n"
cp /u01/app/oracle/product/19.0.0/dbhome_1/assistants/dbca/dbca.rsp /soft
chmod 644 /soft/dbca.rsp
cat <<EOF >>/soft/dbca.rsp
#响应文件版本号
responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v19.0.0
templateName=General_Purpose.dbc
gdbName=cdb19c
sid=cdb19c
createAsContainerDatabase=TRUE
numberOfPDBs=1
pdbName=pdb19c
pdbAdminPassword=Systiger123
sysPassword=Systiger123
systemPassword=Systiger123
datafileDestination=/u01/app/oracle/oradata
recoveryAreaDestination=/u01/app/oracle/fast_recovery_area
storageType=FS
characterSet=AL32UTF8
nationalCharacterSet=AL16UTF16
sampleSchema=true
totalMemory=2048
databaseType=OLTP
emConfiguration=NONE
EOF
sleep 60
echo -e "\n\n****** start db instance create ******\n\n"
##开始建库
su - oracle -c "/u01/app/oracle/product/19.0.0/dbhome_1/bin/dbca -silent -createDatabase -templateName /u01/app/oracle/product/19.0.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc -responseFile NO_VALUE \
-gdbname cdb19c -sid cdb19c \
-createAsContainerDatabase TRUE \
-numberOfPDBs 1 \
-pdbName pdb19c \
-pdbAdminPassword Systiger123 \
-sysPassword Systiger123 -systemPassword Systiger123 \
-datafileDestination '/u01/app/oracle/oradata' \
-redoLogFileSize 50 \
#-storageType FS \
-characterset AL32UTF8 -nationalCharacterSet AL16UTF16 \
-sampleSchema true \
-totalMemory 512 \
-databaseType OLTP \
-emConfiguration NONE"
echo -e "\n\n****** db instance create complete ******\n\n"
三、管理CDB和PDB
1、查看数据库是否为CDB架构(两种方法)
SQL> select name,cdb from v$database;
说明:CDB为YES表示是CDB架构,NO则表示不是CDB架构
SQL> show pdbs;
说明:显示PDB相关信息则表示是CDB架构,没有显示信息则表示不是CDB架构
2、保存当前所有pdb状态,并查看
SQL> alter pluggable database all save state;
SQL> select con_id,con_name from dba_pdb_saved_states;

3、关闭所有pdb
SQL> alter pluggable database all close;

4、关闭cdb(即整个数据库实例)
SQL> shutdown immediate;

5、打开cdb(即整个数据库实例)
SQL>startup

6、查看pdbs状态
SQL> show pdbs;

7、关闭save 状态(关闭后,重启pdb后-所有的pdb启动都是mounted状态)
SQL> alter pluggable database all discard state;

8、打开所有PDB
SQL> alter pluggable database all open;

9、从CDB切换到pdb中
SQL> alter session set container=PDB19C;

10、CDB启动自动打开pdb
SQL> acreate or replace trigger open_all_pdbs
after startup on database
begin
execute immediate 'alter pluggable database all open instances=all';
end;
/

11、查看PDB的启动状态保存情况
SQL> alter pluggable database all save state; #启动
SQL> alter pluggable database all discard state; #关闭
SQL> select con_name,instance_name,state from cdb_pdb_saved_states;

12、从PDB切换到CDB
SQL> alter session set container=cdb$root; #名称是固定的
SQL> show con_name;

13、创建PDB
SQL> create pluggable database pdb01 admin user pdb01adm identified by oracle create_file_dest='/u01/pdbs_data';
SQL> alter session set container=pdb01;
SQL> show con_name;

14、查看新建pdb01的数据文件
SQL> select name from v$datafile;

也可以使用FILE_NAME_CONVERT参数转换文件路径
SQL> create pluggable database pdb02 admin user pdb02adm identified by oracle
file_name_convert=
('/u01/app/oracle/oradata/CDB19C/pdbseed/','/u01/app/oracle/oradata/CDB19C/pdb01');

15、删除PDB
SQL> alter pluggable database pdb01 close immediate;
SQL> drop pluggable database pdb01 including datafiles;

16、查看表空间
在CDB下可以查看所有的表空间及对应的容器
SQL> set lines 999
SQL> select ts#,name,con_id from v$tablespace;

切到PDB后只可以看到自己的
SQL> alter session set container=PDB19C;
SQL> select ts#,name,con_id from v$tablespace;

注意:在CDB下创建的表空间可以给公共用户使用,在PDB中创建的表空间只能给本地用户使用
四、基础运维
1、查看数据库名
SQL> SELECT NAME FROM V$DATABASE;

2、查看实例名
SQL> SELECT instance_name FROM V$INSTANCE;

3、查看服务名
SQL> SELECT global_name FROM global_name;

4、查看SID
SQL> set lines 888
SQL> select instance from v$thread;

5、查询表空间位置
SQL> select tablespace_name,file_name from dba_data_files;

6、查看 Oracle 是用spfile 启动还是 pfile 启动
SQL> show parameter spfile;

7、查找alert日志位置
SQL> show parameter dump;

8、查看是否有阻塞会话
SQL> SELECT sid, serial#, username FROM gv$session WHERE sid IN (SELECT blocking_session FROM gv$session);
9、查看关键进程是否存在
[oracle@myoracle ~]$ ps -ef|grep smon

10、开启归档日志
注意:开启归档日志必须在CDB模式下去开启
SQL> archive log list;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> archive log list;

11、查看闪回状态
SQL>select flashback_on from v$database;

开启闪回
开启闪回的前提是开启归档日志
SQL> alter database force logging;
SQL> alter system set db_recovery_file_dest_size=4385144832;
SQL> alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area';
SQL> alter database flashback on;

12、查看归档日志存放位置
SQL> select * from v$recovery_file_dest;

13、物理备份
[oracle@myoracle CDB19C]$ rman target /
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> backup database;
RMAN> list backup of database; #备份所有文件
RMAN> BACKUP ARCHIVELOG ALL; #备份归档日志
五、日常巡检
1、检查数据库的健康状况
SQL> SELECT name, log_mode, open_mode FROM v$database;

2、检查数据文件的健康状况
SQL> SELECT file_name, bytes/1024/1024 AS size_mb, maxbytes/1024/1024 AS max_size_mb, autoextensible FROM dba_data_files;

3、检查表空间的使用情况
SQL> SELECT tablespace_name, file_id, round(bytes / (1024 * 1024), 2) AS size_mb, maxbytes / (1024 * 1024) AS max_size_mb, autoextensible FROM dba_data_files;

4、检查日志文件的健康状况
SQL> SELECT group#, bytes/1024/1024 AS size_mb, status FROM v$log;

5、检查归档日志的存储空间
SQL> show parameter db; #也可以用下面的
SQL> select * from v$recovery_file_dest;


6、检查数据库的活动会话
SQL> SELECT s.sid, s.serial#, s.username, s.program, s.type, s.terminal, s.machine, s.osuser, s.status FROM v$session s WHERE s.type != 'BACKGROUND';

7、检查正在执行的SQL语句
SQL> SELECT s.sid, s.serial#, s.username, t.sql_text FROM v$session s, v$sqltext t WHERE s.sql_id = t.sql_id;

8、查看数据库的启动和关闭记录
SQL> SELECT * FROM v$diag_info WHERE name = 'Default Trace File';

9、查看数据库的告警日志
SQL> SELECT value FROM v$diag_info WHERE name = 'Diag Trace';

10、查看数据库的指标姓名
SQL> SELECT name, value FROM v$sysstat;

11、查看数据库等待事件
SQL> SELECT sid, event, p1text, p1, p2text, p2, wait_time FROM v$session_wait;

12、查看数据库的锁定情况
SQL> SELECT s.sid, s.serial#, l.type, l.lmode, s.username, s.osuser, s.machine FROM v$session s, v$lock l WHERE s.sid = l.sid;

13、查看数据库的无效对象
SQL> SELECT OWNER,OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE STATUS='INVALID';

14、查看字符集
SQL>select userenv('language') from dual;

15、查看所有的文件路径
SQL>sselect * from dba_directories;

16、查看备份信息
RMAN> list backup of database;
文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。




