第一部分: 创建Oracle镜像和容器
1. 拉取oracle镜像: docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
文件较大 大概7G 请耐心等待 下载成功之后 执行 docker images -a 查看镜像是否拉取成功
2. 创建并启动oracle11g容器 先后运行下面2个命令
docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
docker start oracle11g
结束后 执行docker ps -a 查看容器是否启动
3. 容器配置
(1) 进入容器 docker exec -it oracle11g bash
(2) 切换到root用户s
su root 密码为:helowin (这是因为拉取下来的oracle镜像 默认带了一个叫helowin的实例)
(3) 编辑profile文件配置ORACLE环境变量
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
按ESC键 然后输入:wq! 然后按ENTER键保存并退出vi编辑器
让配置生效:运行 source /etc/profile
(4) 创建软连接 ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
(5) 切换到oracle用户 su - oracle
(6) 登录sqlplus并修改sys、system用户密码:
sqlplus /nolog
conn /as sysdba
alter user system identified by 123456;
alter user sys identified by 123456;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
4. 交给docker-compose管理: 在根目录下新建oracle11目录 并在里面新建datahe和etc目录 全部赋予chmod 777 权限
回到根目录 执行 docker cp oracle11g:/etc/profile ./oracle11/etc 将容器内的profile文件复制到宿主机用于挂载
将下面配置追加到docker-compose.yml
oracle_11g:
image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
container_name: oracle11g
environment:
- TZ=Asia/Shanghai
- ORACLE_HOME=${ORACLE_HOME}
volumes:
- /etc/localtime:/etc/localtime:ro
- ./oracle11/data/oracle:/data/oracle
- ./oracle11/etc/profile:/etc/profile
ports:
- 1521:1521
privileged: true
user: root
restart: always
command: /bin/bash -c "ln -s $ORACLE_HOME/bin/sqlplus /usr/bin"
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 500M
networks:
application:
aliases:
- net-oracle_11g
5. 注意: 从docker run直接启动的容器 不能直接交给docker-compose继续关闭或启动 会冲突
如果已经用docker启动了容器 需要先用 docker rm 删除 然后再用 docker-compose up -d 命令统一启动
docker-compose会首先检查容器是否存在 存在就直接启动 不存在先创建容器再启动
6. 尝试用客户端工具连接helowin实例 用户名sys 密码是(6)步修改的密码 以sysdba方式登录
第二部分: 创建新的oracle实例
1. 执行docker exec -it oracle11g bash命令进入oracle容器
2. cd $ORACLE_BASE/admin 进入admin目录 然后用下面命令创建自己实例对应的各个目录
mkdir order
cd order
mkdir dpdump adump pfile
cd $ORACLE_BASE/oradata
mkdir order
cd $ORACLE_BASE/flash_recovery_area
mkdir order
3. 将下面命令的order改成自己的实例名 并运行 (运行之前检查当前用户 如果是root 需要先切换到oracle su - oracle)
dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbName order -sid order -characterSet ZHS16GBK -sysPassword 123456 -systemPassword 123456 -responseFile NO_VALUE -datafileDestination /home/oracle/app/oracle/oradata/order
如果很快就结束 说明执行失败 需要把容器删除 重新启动再执行 正常会不同的出现百分比 要一会才会成功
3. 执行cd $ORACLE_HOME/dbs命令进入dbs文件夹 复制一份自己实例的ora文件 文件名为init实例名.ora
cp inithelowin.ora initorder.ora
4. 执行vi initorder.ora 打开ora文件 如下 将其中的order部分全部改成自己的实例名
order.__db_cache_size=1191182336
order.__java_pool_size=16777216
order.__large_pool_size=16777216
order.__oracle_base='/home/oracle/app/oracle'#ORACLE_BASE set from environment
order.__pga_aggregate_target=1744830464
order.__sga_target=1610612736
order.__shared_io_pool_size=0
order.__shared_pool_size=369098752
order.__streams_pool_size=0
*.audit_file_dest='/home/oracle/app/oracle/admin/order/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/home/oracle/app/oracle/oradata/order/control01.ctl','/home/oracle/app/oracle/flash_recovery_area/order/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='order'
*.db_recovery_file_dest='/home/oracle/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4070572032
*.diagnostic_dest='/home/oracle/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orderXDB)'
*.local_listener='LISTENER_ORDER'
*.open_cursors=300
*.pga_aggregate_target=1741684736
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1610612736
*.undo_tablespace='UNDOTBS1'
5. cd $ORACLE_BASE/product/11.2.0/dbhome_2/network/admin 进入admin目录 打开tnsnames.ora文件 新建自己实例对应的监听和节点
有可能在步骤3执行之后已经追加 检查一下即可
6. 执行cd $ORACLE_HOME/dbs命令进入dbs文件夹 执行vi createdb.sql创建一个sql文件 内容如下(order改成自己的实例名)
注意不要在nodepad下编辑 可以拷到plsql里再拷贝出来 文件创建成功后 执行chmod 777 createdb.sql 给文件授权可执行
CREATE DATABASE order
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE '/home/oracle/app/oracle/oradata/order/system01.dbf' size 100m reuse autoextend on next 1m maxsize unlimited extent management local
sysaux datafile '/home/oracle/app/oracle/oradata/order/sysaux01.dbf' size 100m reuse autoextend on next 1m maxsize unlimited
default temporary tablespace TEMP tempfile '/home/oracle/app/oracle/oradata/order/temp01.dbf' size 20m reuse autoextend on next 640k maxsize unlimited
undo tablespace UNDOTBS1 datafile '/home/oracle/app/oracle/oradata/order/undo01.dbf' size 20m reuse autoextend on next 5M maxsize unlimited
logfile
GROUP 1 ('/home/oracle/app/oracle/oradata/order/redo1.dbf') size 10m,
GROUP 2 ('/home/oracle/app/oracle/oradata/order/redo2.dbf') size 10m,
GROUP 3 ('/home/oracle/app/oracle/oradata/order/redo3.dbf') size 10m
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16;
7. 执行export ORACLE_SID=order将当前实例设成自己的实例 然后执行sqlplus /nolog conn /as sysdba以管理身份进入sqlplus
可以执行下面语句查看当前实例名字和状态
select instance_number, instance_name, status, database_status from v$instance;
8. 在sqlplus下 前后执行下面4条SQL:
@/home/oracle/app/oracle/product/11.2.0/dbhome_2/dbs/createdb.sql; (数据库有可能在执行步骤3的dbca命令之后已经创建 如果提示是数据库已经open 则略过此步)
@/home/oracle/app/oracle/product/11.2.0/dbhome_2/rdbms/admin/catalog.sql;
@/home/oracle/app/oracle/product/11.2.0/dbhome_2/rdbms/admin/catproc.sql;
@/home/oracle/app/oracle/product/11.2.0/dbhome_2/sqlplus/admin/pupbld.sql;
9. 退出sqlplus 先后运行lsnrctl stop和lsnrctl start重启监听
10. 再进入sqlplus 先后运行shutdown immediate;和startup; 如果实例出现mouted opened状态 说明实例启动成功
11. sqlplus下创建用户并授权:
create user order_admin identified by order_admin_12344321;
grant connect,resource,dba to order_admin;
注意: 重启系统或者docker之后或者重启oracle容器之后 oracle各个实例没有重启
此时应进入各个实例 运行startup重新启动 最后再退出sqlplus执行lsnrctl stop和lsnrctl start重启监听