返回列表 发帖

CentOS8_在Docker中安装Oracle19c

笺注:Docker的安装可参考 CentOS8_在Docker中使用Nginx的反向代理


查看Docker的版本信息:
[root@centos8 ~]# docker -v
Docker version 20.10.21, build baeda1f
[root@centos8 ~]#

已经设置开机自动启动Docker:
[root@centos8 ~]# systemctl is-enabled docker
enabled
[root@centos8 ~]#


从公网下载镜像:( 以下是下载Oracle19c的镜像 )
[root@centos8 ~]# 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@centos8 ~]#


查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY                                             TAG       IMAGE ID       CREATED       SIZE
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle      19c       7b5eb4597688   2 years ago   6.61GB
[root@centos8 ~]#



使用镜像“registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c”创建并启动容器“Rhel7_1”:
[root@centos8 ~]# docker run -itd --name Rhel7_1 --restart=always -p 1521:1521 -e ORACLE_SID=ORCL -e ORACLE_PDB=ORCLPDB -e ORACLE_PWD=orcl -e ORACLE_EDITION=standard -v /opt/share:/home/dir_1 registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
bc37cca2454a1a5d212df747b70d4d880ea0d9abcb9292e8531120333d3fdb09
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 第一个1521是宿主机的端口,暴露给外部直接访问;第二个1521是容器的端口。
--restart=always : 让容器随宿主机的启动而启动。
ORACLE_SID=ORCL : 指定数据库实例名为ORCL
-v 挂载目录 : 这里是把宿主机的目录/opt/share挂载到容器的目录/home/dir_1;假如目录不存在,就会自动创建。
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c : 镜像名称:版本号


在宿主机查看容器“Rhel7_1”是否会随宿主机的启动而启动:(会自动启动)
[root@centos8 ~]# docker inspect Rhel7_1 | grep -i -A2 'RestartPolicy'
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
[root@centos8 ~]#


在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE                                                   COMMAND                  CREATED          STATUS                             PORTS                                       NAMES
bc37cca2454a   registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c   "/bin/sh -c 'exec $O…"   45 seconds ago   Up 43 seconds (health: starting)   0.0.0.0:1521->1521/tcp, :::1521->1521/tcp   Rhel7_1
[root@centos8 ~]#

注释:宿主机的TCP 1521端口,映射到容器“Rhel7_1”的TCP 1521端口。



###

进入容器“Rhel7_1”:
[root@centos8 ~]# docker exec -it Rhel7_1 /bin/bash
[oracle@bc37cca2454a ~]$
[oracle@bc37cca2454a ~]$ whoami
oracle
[oracle@bc37cca2454a ~]$

[oracle@bc37cca2454a ~]$ pwd
/home/oracle
[oracle@bc37cca2454a ~]$ ls -alh
total 16K
drwx------. 2 oracle oinstall  98 Aug  7  2020 .
drwxr-xr-x. 1 root   root      19 Apr 24 15:03 ..
-rw-r--r--. 1 oracle oinstall  18 Nov 22  2019 .bash_logout
-rw-r--r--. 1 oracle oinstall 193 Nov 22  2019 .bash_profile
-rw-r--r--. 1 oracle oinstall 231 Nov 22  2019 .bashrc
-rw-r--r--. 1 oracle oinstall 172 Apr  1  2020 .kshrc
lrwxrwxrwx. 1 root   root      26 Aug  7  2020 setPassword.sh -> /opt/oracle/setPassword.sh
[oracle@bc37cca2454a ~]$


查看容器“Rhel7_1”的系统版本信息:
[oracle@bc37cca2454a ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.8 (Maipo)
[oracle@bc37cca2454a ~]$ uname -r
4.18.0-193.el8.x86_64
[oracle@bc37cca2454a ~]$



查看Oracle的监听状态:(默认会自动启动)
[oracle@bc37cca2454a ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 24-APR-2023 15:06:23

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

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                24-APR-2023 15:05:06
Uptime                    0 days 0 hr. 1 min. 17 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/bc37cca2454a/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Services Summary...
Service "ORCL" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@bc37cca2454a ~]$



登录Oracle,进行测试:
[oracle@bc37cca2454a ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 24 15:07:09 2023
Version 19.3.0.0.0

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

SQL> conn /as sysdba;
Connected.
SQL> Show user;
USER is "SYS"
SQL>



查看数据库的当前状态:(默认会自动启动)
SQL> Select status from v$instance;

STATUS
------------
OPEN

SQL>



查看数据库版本信息:
SQL> Select * from v$version;

BANNER
--------------------------------------------------------------------------------
BANNER_FULL
--------------------------------------------------------------------------------
BANNER_LEGACY
--------------------------------------------------------------------------------
    CON_ID
----------
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
         0

BANNER
--------------------------------------------------------------------------------
BANNER_FULL
--------------------------------------------------------------------------------
BANNER_LEGACY
--------------------------------------------------------------------------------
    CON_ID
----------


SQL>



查看数据库编码:
SQL> Select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

SQL>



查看实例名(SID):
SQL> Select instance_name from v$instance;

INSTANCE_NAME
----------------
ORCL

SQL>



查看用户表空间:
SQL> Select TABLESPACE_NAME from Dba_Tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

SQL>



查看用户表空间的物理文件的存放位置:
SQL> Select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCL/system01.dbf
/opt/oracle/oradata/ORCL/sysaux01.dbf
/opt/oracle/oradata/ORCL/undotbs01.dbf
/opt/oracle/oradata/ORCL/users01.dbf

SQL>



创建表空间(zhuohua_ts):
SQL> CREATE TABLESPACE zhuohua_ts DATAFILE '/opt/oracle/oradata/ORCL/zhuohua.dbf' SIZE 200M AUTOEXTEND ON EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

Tablespace created.

SQL>



再次,查看用户表空间:
SQL> Select TABLESPACE_NAME from Dba_Tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
ZHUOHUA_TS

6 rows selected.

SQL>



查看用户表空间(zhuohua_ts)的物理文件的存放位置:
SQL> Select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCL/system01.dbf
/opt/oracle/oradata/ORCL/sysaux01.dbf
/opt/oracle/oradata/ORCL/undotbs01.dbf
/opt/oracle/oradata/ORCL/zhuohua.dbf
/opt/oracle/oradata/ORCL/users01.dbf

SQL>



创建数据库用户(C##happy),密码(mima),并指明此用户的默认表空间(zhuohua_ts):
SQL> Create user C##happy identified by mima default tablespace zhuohua_ts;

User created.

SQL>



给数据库用户(C##happy)进行赋权:
SQL> Grant connect, resource,dba to C##happy;

Grant succeeded.

SQL>



查看当前用户:
SQL> Show user;
USER is "SYS"
SQL>


切换到数据库用户C##happy:
SQL> Connect C##happy/mima;   
Connected.
SQL>
SQL> Show user;
USER is "C##HAPPY"
SQL>



使用当前用户创建表:
SQL> Create table TABLE_1(ID int,NAME varchar2(10));

Table created.

SQL>


查看当前用户所拥有的表:
SQL> Select t.table_name from user_tables t;

TABLE_NAME
--------------------------------------------------------------------------------
TABLE_1

SQL>



###

Windows客户端使用Navicat连接容器“Rhel7_1”里的Oracle:
图片1.png


图片2.png
连接错误提示: ORA-12526: TNS: 监听程序: 所有适用例程都处于受限模式

解决方法:
SQL> Conn /as sysdba;
Connected.
SQL>
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

System altered.

SQL>



图片3.png
连接错误提示:ORA-28040:没有匹配的验证协议

解决方法:

重新进入容器“Rhel7_1”:
[root@centos8 ~]# docker exec -it Rhel7_1 /bin/bash
[oracle@bc37cca2454a ~]$

[oracle@bc37cca2454a ~]$ vi /opt/oracle/product/19c/dbhome_1/network/admin/sqlnet.ora
追加:
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8


登录Oracle:
[oracle@bc37cca2454a ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 24 16:06:25 2023
Version 19.3.0.0.0

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

SQL> Conn /as sysdba;
Connected.
SQL> Show user;
USER is "SYS"
SQL>


重建数据库用户C##happy的密码:(可以使用原来的密码)
SQL> Alter user C##happy identified by mima;

User altered.

SQL>



图片4.png
连接错误提示:ORA-28000:the account is locked

解决方法:
SQL> Connect system/orcl;  
Connected.
SQL> Show user;
USER is "SYSTEM"
SQL>
SQL> Alter user C##happy account unlock;

User altered.

SQL>


至此,理应可以看到前面创建的表:
图片5.png


往表TABLE_1一次性插入多条记录:
Insert into TABLE_1 values (1,'小李');
Insert into TABLE_1 values (2,'小Lucky');
图片6.png


查询记录:
Select * from TABLE_1;
图片7.png





###

远程Linux客户端(CentOS6/Redhat6)使用Python3脚本获取容器“Rhel7_1”里的Oracle里的指定表数据:(结果只取一个值)
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('C##happy/mima@192.168.168.154:1521/ORCL')
        cursor = db.cursor()
               
        Sql_1 = "Select * from TABLE_1 where NAME = '小Lucky'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()
       
        # print(Result_1) ## (2, '小Lucky')
        print(Result_1[0])
        print(type(Result_1[0]))
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@Zabbix_server_01 ~]#


脚本运行的结果:
[root@Zabbix_server_01 ~]# python3 xx.py
2
<class 'int'>

[root@Zabbix_server_01 ~]#





######
######

使用系统管理员root进入容器“Rhel7_1”:
[root@centos8 ~]# docker exec -it --user root Rhel7_1 /bin/bash
bash-4.2#
bash-4.2# whoami
root
bash-4.2#

重置系统管理员root的密码:
bash-4.2# passwd root
bash: passwd: command not found
bash-4.2#
bash-4.2# yum -y install passwd

bash-4.2# echo 'P@qq1rd' | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
bash-4.2#
bash-4.2# exit
exit
[root@centos8 ~]#



重新进入容器“Rhel7_1”:
[root@centos8 ~]# docker exec -it Rhel7_1 /bin/bash
[oracle@bc37cca2454a ~]$
[oracle@bc37cca2454a ~]$ whoami
oracle
[oracle@bc37cca2454a ~]$

切换到系统管理员root:
[oracle@bc37cca2454a ~]$ su - root
Password:
Last login: Mon Apr 24 16:03:49 UTC 2023 on pts/1
-bash-4.2# whoami
root
-bash-4.2#



笺注:
Docker宿主机的防火墙其实无需特意打开任何TCP端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports

[root@centos8 ~]#















######
######


把容器“Rhel7_1”创建成一个新镜像:(创建时,容器“Rhel7_1”不用关机)
[root@centos8 ~]# docker commit Rhel7_1 oracle19c_1:3.8.8
sha256:a6708069ea4378125ad49284b51503538497c06a06ba233e5fc6dc00187a9515
[root@centos8 ~]#


新镜像“oracle19c_1:3.8.8”创建成功:
[root@centos8 ~]# docker images
REPOSITORY                                             TAG       IMAGE ID       CREATED          SIZE
oracle19c_1                                            3.8.8     a6708069ea43   11 minutes ago   10.9GB
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle      19c       7b5eb4597688   2 years ago      6.61GB
[root@centos8 ~]#


使用镜像“oracle19c_1:3.8.8”创建并启动容器“Rhel7_2”:
[root@centos8 ~]# docker run -itd --name Rhel7_2 --restart=no -p 1522:1521 -v /opt/share:/home/dir_1 oracle19c_1:3.8.8
25f4d9f3ac251939822aa103b7d62ca34e73ffab0d5e68737f395e23bea66073
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 1522是宿主机的端口,暴露给外部直接访问;1521是容器的端口。
--restart=no : 不让容器随宿主机的启动而启动;缺省时,就是不让容器随宿主机的启动而启动。
-v 挂载目录 : 这里是把宿主机的目录/opt/share挂载到容器的目录/home/dir_1;假如目录不存在,就会自动创建。
oracle19c_1:3.8.8 : 镜像名称:版本号


在宿主机查看容器“Rhel7_2”是否会随宿主机的启动而启动:(不会自动启动)
[root@centos8 ~]# docker inspect Rhel7_2 | grep -i -A2 'RestartPolicy'
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
[root@centos8 ~]#



###

进入容器“Rhel7_2”:
[root@centos8 ~]# docker exec -it Rhel7_2 /bin/bash
[oracle@25f4d9f3ac25 ~]$


登录Oracle,进行测试:
[oracle@25f4d9f3ac25 ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Jun 4 06:12:06 2023
Version 19.3.0.0.0

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

SQL> Conn /as sysdba;
Connected.
SQL> Show user;
USER is "SYS"
SQL>


查看数据库的当前状态:(默认会自动启动)
SQL> Select status from v$instance;

STATUS
------------
OPEN

SQL>


查看数据库编码:
SQL> Select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

SQL>


查看实例名(SID):
SQL> Select instance_name from v$instance;

INSTANCE_NAME
----------------
ORCL

SQL>



此数据库的闪回功能尚未启用:
SQL> Select log_mode,open_mode,flashback_on from v$database;

LOG_MODE     OPEN_MODE            FLASHBACK_ON
------------ -------------------- ------------------
NOARCHIVELOG READ WRITE           NO

SQL>


此数据库不支持闪回功能:
SQL> Select * from v$OPTION where parameter like 'Flashback%';

PARAMETER
----------------------------------------------------------------
VALUE                                                                CON_ID
---------------------------------------------------------------- ----------
Flashback Table
FALSE                                                                     0

Flashback Database
FALSE                                                                     0

Flashback Data Archive
TRUE                                                                      0


SQL>


SQL> Alter database flashback on;
Alter database flashback on
*
ERROR at line 1:
ORA-00439: feature not enabled: Flashback Database


SQL>



查看用户表空间:
SQL> Select TABLESPACE_NAME from Dba_Tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
ZHUOHUA_TS

6 rows selected.

SQL>



切换到数据库用户C##happy:
SQL> Connect C##happy/mima;   
Connected.
SQL>
SQL> Show user;
USER is "C##HAPPY"
SQL>


查看当前用户所拥有的表:
SQL> Select t.table_name from user_tables t;

TABLE_NAME
--------------------------------------------------------------------------------
TABLE_1

SQL>


使用当前用户创建表:
SQL> Create table TABLE_2(ID int,NAME varchar2(20));

Table created.

SQL>


再次,查看当前用户所拥有的表:
SQL> Select t.table_name from user_tables t;

TABLE_NAME
--------------------------------------------------------------------------------
TABLE_2
TABLE_1


SQL>



###

Windows客户端使用Navicat连接容器“Rhel7_2”里的Oracle:
图片1.png
注释:数据库用户为C##happy,实例名(SID)为orcl,端口为1522


至此,理应可以看到前面创建的表:
图片2.png


查询表TABLE_1的记录:
Select * from TABLE_1;
图片3.png


往表TABLE_2一次性插入多条记录:
Insert into TABLE_2 values (1,'小明');
Insert into TABLE_2 values (2,'小小Lucky');

Select * from TABLE_2;
图片4.png





######
######

Oracle19c的备份与还原:

备份数据库用户C##happy的表、表数据:
[oracle@25f4d9f3ac25 ~]$ cat backup_happy_data.sh
#!/bin/bash
rq=`date '+%Y%m%d%H%M'`
exp C##happy/mima file=/home/oracle/happy_$rq.dmp log=/home/oracle/happy_data_$rq.log grants=y

注释:
包含了指定用户所拥有的表、及其表中的数据;
用户C##happy的密码为mima


运行脚本备份数据库用户C##happy的表、表数据:
[oracle@25f4d9f3ac25 ~]$ bash backup_happy_data.sh


备份完成:
[oracle@25f4d9f3ac25 ~]$ pwd
/home/oracle
[oracle@25f4d9f3ac25 ~]$ ls
backup_happy_data.sh  happy_202305100533.dmp  happy_data_202305100533.log  setPassword.sh
[oracle@25f4d9f3ac25 ~]$



######

删除数据库用户C##happy的所有表:

先获取删除当前用户的所有表的SQL语句:
Select 'drop table '||table_name||';' as sqlscript from user_tables;
图片1.png

复制删除当前用户的所有表的SQL语句:
图片2.png

执行删除当前用户的所有表的SQL语句:
图片3.png

确认当前用户的所有表都已经被删除:
Select t.table_name from user_tables t;
图片4.png



######

还原数据库用户C##happy的表、表数据:
[oracle@25f4d9f3ac25 ~]$ imp C##happy/mima full=Y ignore=Y  file=/home/oracle/happy_202305100533.dmp

注释:
还原前,对应的用户表空间和数据库用户必须已经存在;


还原成功:
图片5.png

图片6.png

图片7.png





相关文章:
Python3脚本管理Oracle11gR2
使用Navicat连接Oracle11gR2

Oracle11gR2恢复已删除或更改的数据
Oracle11gR2的备份与还原

CentOS8_在Docker中安装Flask
CentOS8_在Docker中安装Oracle11gR2

返回列表