镜像

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/akaiot/oracle_11g:latest
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/akaiot/oracle_11g:latest docker.io/akaiot/oracle_11g:latest

创建并启动容器

mkdir -p /home/oracle/app/oracle11g/oradata
# 容器内端口默认1521,且通过 -p 参数修改不成功,所以只能修改外部的端口
docker run -itd --name oracle --restart=always -p 1523:1521 \
-v /home/oracle/app/oracle11g/oradata-new:/home/oracle/app/oracle11g/oradata \
-e ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2 \
-e ORACLE_SID=helowin \
-e ORACLE_CHARACTERSET=ZHS16GBK \
docker.io/akaiot/oracle_11g:latest

查看日志

docker logs -f --tail 100 oracle11g


/home/oracle/app/oracle/product/11.2.0/dbhome_2
Processing Database instance "helowin": log file /home/oracle/app/oracle/product/11.2.0/dbhome_2/startup.log
Fixed Size                  2213776 bytes
Variable Size             402655344 bytes
Database Buffers         1174405120 bytes
Redo Buffers               24137728 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

/home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/dbstart: Database instance "helowin" warm started.
tail: unrecognized file system type 0x794c7630 for `/home/oracle/app/oracle/product/11.2.0/dbhome_2/startup.log'. Reverting to polling.

登录到容器内

docker exec -it oracle11g bash

配置环境变量

su root
###Password: helowin
vi /etc/profile
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH
source /etc/profile

exit
###切到oracle用户
vi /home/oracle/.bashrc
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH
source /home/oracle/.bashrc


# 1. 切换至root用户(默认是oracle用户),密码为helowin
su root

# 2. 创建软链接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin

# 3.切换回oracle用户
su oracle

# 4. 登录sql plus
sqlplus /nolog
conn /as sysdba
## 4.1 修改system用户密码为system
alter user system identified by system;
## 4.2 修改sys用户密码为system
alter user sys identified by system;
## 4.3 新增一个测试用户(用户名:test,密码:test123);
create user test identified by test123;
## 4.4 将dba权限给内部管理员账号和密码
grant connect,resource,dba to test;
## 4.5 修改密码策略规则为:密码永不过期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
## 4.6 修改数据库最大连接数;
alter system set processes=1000 scope=spfile;
## 4.7 最后重启数据库;
shutdown immediate;
startup;

# 5.退出
exit

登录

# 必须要切到 oracle 用户
su oracle
sqlplus / as sysdba

查询数据库状态

SELECT status FROM v$instance;

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

连接验证

  • SID 和 Service Name 均为 helowin
  • 用密码密码: sys/system

修改密码

alter user system identified by system;
alter user sys identified by system;

异常记录

1. ORA-00205

ORA-00205: error in identifying control file, check alert log for more info

异常原因:运行容器是指定的目录为 /home/oracle/app/oracle/oradata ,该目录是容器内安装Oracle自带的目录,换一个别的新建目录即可

2. ORA-12899、ORA-02374、ORA-02372

ORA-02374: conversion error loading table "BASP_HTBA"."HTBA_HT_HTZB"
ORA-12899: value too large for column FJ7_YS_NEW_ZTJGBXSX (actual: 36, maximum: 32)

ORA-02372: data for row: FJ7_YS_NEW_ZTJGBXSX : 0X'D2D4A1B6D7A1D5ACD6CAC1BFB1A3D6A4CAE9A1B7CEAAD7BC'

错误含义
ORA-12899: value too large for column FJ7_YS_NEW_ZTJGBXSX (actual: 36, maximum: 32)
→ 源库该列长度 32 BYTE,但 dump 里某行数据 36 BYTE(含中文或扩展字符),异机字符集变为 AL32UTF8 后单汉字占 3 BYTE,导致越界。

根因

-- 源库(导出端)
SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';
-- 常见结果:ZHS16GBK

-- 目标库(当前)
SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';
-- 结果:AL32UTF8

GBK→UTF8 转换后长度膨胀,列定义没变,数据越界。

解决思路(按推荐顺序)

  1. 扩展列长度(最快,无数据损失)

  2. 使用 REMAP_DATA 跳过异常行(仅当不能改结构)

  3. 重建库并选择 GBK 字符集(代价最大)

由于我是在做异机恢复,故选择思路3,其他思路各位可以自行搜索

修改字符集为 ZHS16GBK:

  • 进入容器后,以 sysdba 身份登录 SQL*Plus,执行以下命令:

    ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;

遇到报错

SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK
*
ERROR at line 1:
ORA-12719: operation requires database is in RESTRICTED mode
###关闭数据库:

SHUTDOWN IMMEDIATE;
###启动到挂载模式:

STARTUP MOUNT;
###启用受限会话并禁用后台进程:

ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
###这些命令确保了只有具备 RESTRICTED SESSION 权限的用户可以连接,并暂停了可能干扰字符集修改的作业和队列进程。

###打开数据库:

ALTER DATABASE OPEN;
###执行字符集修改(使用 INTERNAL_USE 跳过超集检查):

ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
###此命令会强制将字符集更改为 ZHS16GBK,即使它不是当前字符集(AL32UTF8)的超集。

###关闭并重新启动数据库以应用更改:

SHUTDOWN IMMEDIATE;
STARTUP;
###验证字符集:
###重启后,执行以下查询确认修改是否成功:

SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';

###预期结果应为 ZHS16GBK

重要注意事项:

  • 风险提示:修改数据库字符集是一项高风险操作,强烈建议在操作前对数据库进行完整备份。此过程可能导致现有数据出现乱码或损坏,尤其当数据原本以不同字符集存储时。
  • 客户端设置:为确保最佳兼容性,客户端(如应用程序或SQL*Plus)的 NLS_LANG 环境变量也应设置为 ZHS16GBK,以避免潜在的字符显示问题。

删除 Docker 容器

docker stop oracle11g
docker rm oracle11g

转自

https://dongkelun.com/2025/06/17/oracle/dockerOracle11G/

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐