1、拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
2、创建挂载目录
# 创建文件
mkdir -p /data/oracle/oradata
# 授权,不授权会导致后面安装失败
chmod 777 /data/oracle/oradata
3、启动容器
docker run -d \
--restart=always \
--name orcl19c \
--network host \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ORCLCDB \
-e ORACLE_PDB=ORCLPDB \
-e ORACLE_PWD=123456 \
-e ORACLE_EDITION=standard \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /data/oracle/oradata:/opt/oracle/oradata \
-v /etc/localtime:/etc/localtime:ro \
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
安装过程较慢,可以通过命令:docker logs 容器id 查看安装进度。最终显示:DATABASE IS READY TO USE! 即为安装成功。
参数解释:
-p 1521:1521: 将容器的 1521 端口映射到主机的 1521 端口,Oracle 数据库监听端口。
-p 5502:5500: 将容器的 5500 端口映射到主机的 5502 端口,用于 Oracle Enterprise Manager Express 访问的端口。
-e ORACLE_SID=ORCLCDB: 设置 Oracle 实例的 SID(System Identifier),这里设置为 ORCLCDB。
-e ORACLE_PDB=ORCLPDB: 设置 Oracle 的 Pluggable Database(PDB)的名称,这里设置为 ORCLPDB。
-e ORACLE_PWD=oracle: 设置 Oracle 系统用户 SYS 和 SYSTEM 的初始密码为 oracle。
-e ORACLE_EDITION=standard: 设置 Oracle 的版本为标准版(standard),这影响 Oracle 的功能集。
-e ORACLE_CHARACTERSET=AL32UTF8: 设置 Oracle 数据库的字符集为 AL32UTF8,即 Unicode 字符集。
-v /data/oracle/oradata/:/opt/oracle/oradata/: 将主机上的 /data/oracle/oradata/ 目录挂载到容器内的 /opt/oracle/oradata/ 目录,用于持久化存储数据库文件。
-v /etc/localtime:/etc/localtime:ro:将宿主机上的时区设置文件(/etc/localtime)挂载到Docker容器中相同的位置,使容器能够使用与宿主机相同的时区设置
-p 5502:5500: 将容器的 5500 端口映射到主机的 5502 端口,用于 Oracle Enterprise Manager Express 访问的端口。
-e ORACLE_SID=ORCLCDB: 设置 Oracle 实例的 SID(System Identifier),这里设置为 ORCLCDB。
-e ORACLE_PDB=ORCLPDB: 设置 Oracle 的 Pluggable Database(PDB)的名称,这里设置为 ORCLPDB。
-e ORACLE_PWD=oracle: 设置 Oracle 系统用户 SYS 和 SYSTEM 的初始密码为 oracle。
-e ORACLE_EDITION=standard: 设置 Oracle 的版本为标准版(standard),这影响 Oracle 的功能集。
-e ORACLE_CHARACTERSET=AL32UTF8: 设置 Oracle 数据库的字符集为 AL32UTF8,即 Unicode 字符集。
-v /data/oracle/oradata/:/opt/oracle/oradata/: 将主机上的 /data/oracle/oradata/ 目录挂载到容器内的 /opt/oracle/oradata/ 目录,用于持久化存储数据库文件。
-v /etc/localtime:/etc/localtime:ro:将宿主机上的时区设置文件(/etc/localtime)挂载到Docker容器中相同的位置,使容器能够使用与宿主机相同的时区设置
4、连接数据库
docker exec -it orcl19c /bin/bash
sqlplus / as sysdba
show pdbs;
5、创建表空间
# 查看当前容器数据库
select sys_context('USERENV','CON_NAME') from dual;
# 切换容器数据库
alter session set container=ORCLPDB;
# 创建表空间
create tablespace akim_data
datafile '/opt/oracle/oradata/akim_data.dbf'
size 100M autoextend on next 10m maxsize unlimited
extent management local;
# 创建临时表空间
create temporary tablespace akim_tmp
tempfile '/opt/oracle/oradata/akim_tmp.dbf'
size 10M
autoextend on
next 10M maxsize unlimited;
6、创建用户
# 创建用户
create user akim identified by 123456
default tablespace akim_data
temporary tablespace akim_tmp;
# 用户授权
grant dba to akim; # 直接给数据库管理员权限,以下授权就不需要了
grant connect to akim;
grant imp_full_database to akim;
grant resource to akim;
grant create database link to akim;
grant create public synonym to akim;
grant create synonym to akim;
grant create view to akim;
grant unlimited tablespace to akim;
grant execute on dbms_crypto to akim;
--取消授权
REVOKE <权限> FROM <用户名>;
7、使用 Navicat 连接数据库
注意:
Ⅰ.docker 启动容器失败报错:library initialization failed - unable to allocate file descriptor table......
解决办法:
修改 docker.service,可以通过命令:systemctl status docker 查看此文件具体路径,一般为: /usr/lib/systemd/system/docker.service。在ExecStart 配置后追加:--default-ulimit nofile=65535:65535。修改完成后,
vim /usr/lib/systemd/system/docker.service
重启docker
systemctl daemon-reload
systemctl restart docker
Ⅱ.远程连接报错:ORA-12514(貌似虚拟机安装才需要,这里用的虚拟机docker安装,主机连接时报这个错)
# 查看监听文件所在位置
lsnrctl status
# 编辑监听文件
vim /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
新增内容:
需要注意 GLOBAL_DBNAME 和 SID_NAME,使用的库是 ORCLPDB,启动容器时给的 SID 是 ORCLCDB。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCLPDB)
(ORACLE_HOME = /opt/oracle/product/19c/dbhome_1)
(SID_NAME = ORCLCDB)
)
)
# 重启监听
lsnrctl reload
Ⅲ.关于使用 AL32UTF8 字符集在导入数据时报错:“value too large for column” 等问题
数据导入时报ORA-12899错误,即插入的数据长度超出字段的设置长度,实际长度并不长,这是由于Oracle字符集不同,汉字占的长度不同造成的。中文在ZHS16GBK中占2个字节,在UTF-8中却占3个字节,所以汉字导入UTF-8字符集的数据库就很容易出现字段长度不够,解决办法,一个是增加字段长度,还有就是修改字符集。如果系统中已经存在很多数据,建议修改字段长度,因为修改字符集后原来数据库表中的汉字全部变成乱码。如果一定要修改字符集,必须先导出数据,待到字符集修改后再重新导入这些数据。
需要修改数据库字符集为:ZHS16GBK,为什么不在创建容器的时候直接指定,试了直接指定 ZHS16GBK 会报错导致数据库安装失败。
需要修改数据库字符集为:ZHS16GBK,为什么不在创建容器的时候直接指定,试了直接指定 ZHS16GBK 会报错导致数据库安装失败。
# 进入数据库
$sqlplus / as sysdba
# 查看服务器端字符集
SQL> select * from V$NLS_PARAMETERS;
# 若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器,
# 然后执行以下命令:
SQL>shutdown immediate;
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
ERROR at line 1:ORA-12721: operation cannot execute when other sessions are active
# 若出现上面的错误,使用下面的办法进行修改,使用INTERNAL_USE可以跳过超集的检查:
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
Ⅳ.通过 .sql 文件导入数据时报错:ORA-01704: string literal too long
是 sql 语句长度受限的原因,通过 dmp 方式导入。
文章评论