目录
一. 拉取Oracle 19c镜像
二. 查看镜像
三. 创建Oracle 19c镜像的容器
3.1创建目录
3.2 创建实例
3.3 查看日志
四、 修改密码
setPassword.sh 脚本如下
五、连接数据库
5.1测试方案一:进入容器内部测试
六、PDB相关
6.1 概述
6.2 查询默认PDB服务名
七、PDB模式下,创建表空间、用户、授权、导入dump文件
7.1 导入dump文件
参数说明
TRANSFORM 适用场景
语法
transform_name : SEGMENT_ATTRIBUTES
SEGMENT_ATTRIBUTES : value 值
[root@node08002 docker]# docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
19c: Pulling from zhuyijun/oracle
bce8f778fef0: Pull complete
3fc3fd32c0bc: Pull complete
02948dd6d654: Pull complete
67f2dfeb2f1b: Pull complete
2e42d8039fd9: Pull complete
b94f01bb60c6: Pull complete
Digest: sha256:3898a9394720f30ce7f0b83ef2d172f4cd11b958282e0505f83cf2b0e5eaf7d4
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
[root@node08002 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle 19c 7b5eb4597688 20 months ago 6.61GB
[root@node08002 docker]#
[root@node08002 docker]# mkdir /opt/oradata
[root@node08002 docker]# chmod -R 777 /opt/oradata/
[root@node08002 docker]#
[root@node08002 docker]# docker run -d -it --name oracle19c -p 1521:1521 -p 5500:5500 -v /opt/oradata:/opt/oracle/oradata registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
[root@node08002 ~]# docker logs -f oracle19c
ORACLE EDITION: ENTERPRISE
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: CRiP1dWzDHA=1
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 06-APR-2022 10:28:18
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Starting /opt/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/1249a4a7bb32/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 06-APR-2022 10:28:18
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/1249a4a7bb32/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Prepare for db operation
8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete
40% complete
43% complete
46% complete
Completing Database Creation
51% complete
54% complete
Creating Pluggable Databases
58% complete
77% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/opt/oracle/cfgtoollogs/dbca/ORCLCDB.
Database Information:
Global Database Name:ORCLCDB
System Identifier(SID):ORCLCDB
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ORCLCDB/ORCLCDB.log" for further details.
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 6 10:48:37 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
系统默认的system密码修改成oracle
[root@node08002 ~]# docker exec oracle19c ./setPassword.sh oracle
setPassword.sh 脚本如下
[root@node08002 ~]# docker exec -it oracle19c /bin/bash
[oracle@1249a4a7bb32 ~]$ ls
setPassword.sh
[oracle@1249a4a7bb32 ~]$ pwd
/home/oracle
[oracle@1249a4a7bb32 ~]$ cat setPassword.sh
#!/bin/bash
# LICENSE UPL 1.0
#
# Copyright (c) 1982-2018 Oracle and/or its affiliates. All rights reserved.
#
# Since: November, 2016
# Author: [email protected]
# Description: Sets the password for sys, system and pdb_admin
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
#
ORACLE_PWD=$1
ORACLE_SID="`grep $ORACLE_HOME /etc/oratab | cut -d: -f1`"
ORACLE_PDB="`ls -dl $ORACLE_BASE/oradata/$ORACLE_SID/*/ | grep -v pdbseed | awk '{print $9}' | cut -d/ -f6`"
ORAENV_ASK=NO
source oraenv
sqlplus / as sysdba << EOF
ALTER USER SYS IDENTIFIED BY "$ORACLE_PWD";
ALTER USER SYSTEM IDENTIFIED BY "$ORACLE_PWD";
ALTER SESSION SET CONTAINER=$ORACLE_PDB;
ALTER USER PDBADMIN IDENTIFIED BY "$ORACLE_PWD";
exit;
EOF
[oracle@1249a4a7bb32 ~]$
sqlplus system/[email protected]:1521/ORCLCDB
[root@node08002 ~]# docker exec -it oracle19c /bin/bash
[oracle@1249a4a7bb32 ~]$ sqlplus system/oracle@localhost:1521/ORCLCDB
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Apr 7 01:54:17 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Thu Apr 07 2022 01:53:14 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> Show user;
USER is "SYSTEM"
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@1249a4a7bb32 ~]$
[root@node08002 ~]# docker exec -it oracle19c /bin/bash
[oracle@1249a4a7bb32 ~]$ cd /opt/oracle/product/19c/dbhome_1/network/admin/
[oracle@1249a4a7bb32 admin]$ ls
listener.ora samples shrept.lst sqlnet.ora tnsnames.ora
[oracle@1249a4a7bb32 admin]$ vim sqlnet.ora
[oracle@1249a4a7bb32 admin]$ cat sqlnet.ora
NAME.DIRECTORY_PATH= (TNSNAMES, EZCONNECT, HOSTNAME)
[oracle@1249a4a7bb32 admin]$ vim sqlnet.ora
[oracle@1249a4a7bb32 admin]$ cat sqlnet.ora
NAME.DIRECTORY_PATH= (TNSNAMES, EZCONNECT, HOSTNAME)
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
[oracle@1249a4a7bb32 admin]$ exit
exit
[root@node08002 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1249a4a7bb32 registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c "/bin/sh -c 'exec $O…" 16 hours ago Up 16 hours (healthy) 0.0.0.0:1521->1521/tcp, :::1521->1521/tcp, 0.0.0.0:5500->5500/tcp, :::5500->5500/tcp oracle19c
[root@node08002 ~]# docker restart oracle19c
oracle19c
[root@node08002 ~]#
很奇怪,又要修改一次密码,具体操作步骤如下:
[root@node08002 ~]# docker exec -it oracle19c /bin/bash
[oracle@1249a4a7bb32 ~]$ sqlplus system/oracle@localhost:1521/ORCLCDB
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Apr 7 02:59:52 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Thu Apr 07 2022 02:59:10 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> alter user system identified by oracle;
User altered.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
终于可以连接了
19C其实也是属于12C的一个小版本,只是Oracle改变了版本策略,现在都叫18C\19C\20C,一年一个版本。
Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
cdb相当于操作系统,调用并管理各个pdb。pdb相当于真正提供业务需求的数据库实例。oracle 12c安装后只创建了cdb,需要自己生成相应的pdb。oracle 12c使用了CDB-PDB架构,类似于docker,在container-db内可以加载多个pluggable-db.
CDB组件(Components of a CDB)一个CDB数据库容器包含了下面一些组件:
- ROOT组件
ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。
- SEED组件
Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。
- PDBS
CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。
理解了CDB与PDB的关系后我们就知道,我们的平时的数据库操作大多数和PDB相关
oracle 12c截止2018年7月25日是两个版本,一个是Oracle Database 12c 第 1 版,另一个是Oracle Database 12c 第 2 版
Oracle Database 12c 第 1 版安装的时候会默认安装一个名称为pdborcl的实例(Oracle Database 12c 第 2 版默认名是orclpdb),具体名称按照版本有些许差异。
[root@node08002 dockerfiles]# docker exec -it oracle19c /bin/bash
[oracle@1b87427c7c8e ~]$ sqlplus system/oracle@localhost:1521/ORCLCDB
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 8 09:07:46 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Fri Apr 08 2022 09:07:35 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select name,open_mode from v$containers;
NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
CDB$ROOT
READ WRITE
PDB$SEED
READ ONLY
ORCLPDB1
READ WRITE
SQL>
得出结论:PDB模式下的的服务名为ORCLPDB1
PDB的连接方式为:sqlplus system/oracle@localhost:1521/ORCLPDB1
PDB的连接方式为:sqlplus system/oracle@localhost:1521/ORCLPDB1
#创建目录
mkdir -p /home/oracle/dpdump
#新建directory
create directory DUMP_DIR as '/home/oracle/dpdump';
#创建表空间
CREATE tablespace 表空间名称_TBS
DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/XXXX_tbs_01.dbf'
SIZE 1500M
autoextend ON
next 50m
maxsize unlimited;
#删除用户以及文件
--drop user 用户名 cascade;
#创建用户和授权
create user 数据库用户名 identified 数据库密码 default tablespace 表空间名称_TBS;
#创建授权[偷懒直接给dba权限]
grant connect, resource to 数据库用户名;
grant dba to 数据库用户名;
impdp system/oracle@localhost:1521/ORCLPDB1 directory=DUMP_DIR dumpfile=exdp_导出文件.dmp remap_schema=原始数据库用户名:新的数据库用户名 schemas=新的数据库用户名 logfile=日志文件名称.log TRANSFORM=segment_attributes:n
TRANSFORM=segment_attributes:n
参数说明
官方文档:
TRANSFORM 适用场景
导入和导出的时候,有些表空间不一样。比如导出的时候该对象是在A 表空间,导入到另一个库没有表空间 A 就会报错。但是使用这个参数就会正常导入, 对象会存储在该用户下的默认表空间中。
语法
TRANSFORM = transform_name:value[:object_type]object_type 是可选的,如果不指定 object_type ,那么则指定导入的所有有效的对象。
TRANSFORM 对下面对象有效: CLUSTER, CONSTRAINT, INDEX, ROLLBACK_SEGMENT, TABLE, and TABLESPACE.
transform_name : SEGMENT_ATTRIBUTES
在官方文档中有很详细的介绍,这里只介绍一个 的参数值。
SEGMENT_ATTRIBUTES : value 值
值:Y|N
Y :默认值,表示这个段的属性 ( 物理属性,存储属性,表空间和 logging) 都将被包含在 DDL 的语句中。
N: 表示这些属性都不会在 DDL 语句中。意思是导入该对象的时候,不会指定表空间等属性,只是简单的创建一个对象。