宝塔服务器: docker安装 oracle11g镜像
我是用win本地docker先将 oracle11g镜像下载好 然后导出上传到 宝塔面板上面的
具体命令:
下载镜像:大概6.8个G左右
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
然后导出镜像:
docker save -o D:wwworacle11g.tar registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
等导出完成后 再将该文件上传到 宝塔服务器某个路径地址
上传成功以后 使用SSH命令 将本地镜像导入到 docker里面
docker load -i /data/docker/oracle11g/oracle_11g_image.tar
面板上面也有导入本地镜像功能,但是我使用的时候导入失败了..
导入成功以后 使用 docker images 命令查看本地镜像列表
下一步 使用命令将容器启动:
docker run
--privileged
-d
--restart=always
-v /data/oracle:/data/oracle
-p 1521:1521
--name oracle11g
-e ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
-e ORACLE_SID=helowin
-e PATH=/home/oracle/app/oracle/product/11.2.0/dbhome_2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
注意: 确保宿主机上面的 /data/oracle 这个目录存在
1. docker run 作用:这是启动一个新的 Docker 容器的命令。
2. --privileged 作用:授予容器几乎所有的主机权限。这允许容器内的进程执行通常需要超级用户权限的操
作,如加载内核模块、更改网络配置等。 注意事项:虽然有时是必要的,但应谨慎使用此选项,因为它
可能会带来安全风险。
3. -d 作用:以分离模式(后台)运行容器。这意味着容器会在后台运行,而不会占用当前终端。
等效选项:--detach
4. --restart=always 作用:设置容器的重启策略为始终重启。无论容器因什么原因停止(包括手动停止),
Docker 都会尝试重新启动它。
其他选项:
no:不自动重启容器。
on-failure:仅在容器退出状态码表示失败时重启。
unless-stopped:总是重启容器,除非容器被手动停止。
5. -v /data/oracle:/data/oracle 作用:将主机上的 /data/oracle 目录挂载到容器内
的 /data/oracle 目录。这样可以实现数据持久化,即使容器停止或删除,数据仍然保留在主机上。
等效选项:--volume
格式:host_path:container_path[:options]
6. -p 1521:1521 作用:将主机的 1521 端口映射到容器的 1521 端口。这使得你可以通过主机的 IP 地
址和端口 1521 访问容器内的 Oracle 数据库服务。
等效选项:--publish
格式:host_port:container_port
7. --name oracle11g 作用:为容器指定一个名称 oracle11g。这使得你可以通过这个名称而不是容器 ID
来引用容器。
等效选项:无
8. registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 作用:指定要使用的镜像。这里是阿里
云容器镜像服务中的 helowin/oracle_11g 镜像。
格式:repository/image_name:tag(如果省略标签,默认使用 latest)
总结:
这条命令的作用是启动一个名为 oracle11g 的 Docker 容器,使用来自阿里云的 helowin/oracle_11g 镜像
完事儿 下一步 直接进入到 oracle容器里面 这一步很关键, 之前看别的文章是 docker exec -it oracle11g bash这样进入的,会有一些问题 下面直接使用 root来进入 权限大一点
docker exec -it -u root oracle11g bash
修改环境变量: (不可以省略 也创建了吧)
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
设置权限:
# 进入容器内部 docker exec -it -u root oracle11g bash # 检查现有用户和组 id oracle 输出-> uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba),502(oper) oracle 用户的 UID 是 500。 dba 组的 GID 是 501。 # 在主机上执行 chown -R 500:501 /data/oracle chmod -R 750 /data/oracle 或者,如果您更喜欢使用用户名和组名: # 在主机上执行 chown -R oracle:dba /data/oracle chmod -R 750 /data/oracle 确保更改已正确应用: ls -l /data/oracle 您应该看到类似以下的输出: total 8 drwxr-x--- 2 oracle dba 4096 Dec 21 09:36 archivelog drwxr-x--- 3 oracle dba 4096 Dec 23 14:12 data
注意:为了以防万一 导致挂载不成功 我是在 宿主机服务器, 以及容器里面 以及容器里面的 su oracle用户上 都设置了一遍 chown -R 500:501 /data/oracle
chmod -R 750 /data/oracle😒😒😒😒😒😒😓😓😓😭😭😭😭这个玩意儿 折腾了我一下午
这一步很重要啊,, 错误的话导致容器重启后 无法挂载本地导致数据库文件丢失 我就遇到这个问题
创建连接命令:
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
下面是修改默认用户密码:
切换用户,并登录
命令: su - oracle
命令: sqlplus /nolog
SQL> conn /as sysdba
修改sys system用户的密码(密码个人自定义,这里用root代表)
SQL> alter user system identified by root;
SQL> alter user sys identified by root;
SQL> create user admin identified by root; --创建一个管理账号,自定义账号和密码
SQL> grant connect,resource,dba to admin; --授权给管理账号
#关闭数据库
SQL> shutdown immediate;
#开启mount状态
SQL> startup mount;
# 开启归档日志,出现Database altered. 表示开启成功
SQL> alter database archivelog;
#查看归档状态
SQL> SELECT log_mode FROM v$database;
#打开数据库,一定要执行
SQL> alter database open;
确保归档日志文件被写入到预期的位置。你可以使用以下查询来查看归档日志的目的地:
SQL> SHOW PARAMETER log_archive_dest_1;
你可以使用以下查询来查看归档日志的状态和信息:
SQL> SELECT * FROM v$archived_log;
为了防止归档日志文件占用过多磁盘空间,你可以配置自动删除旧的归档日志文件。例如,设置保留天数:
ALTER SYSTEM SET log_archive_max_processes = 4 SCOPE=BOTH;
ALTER SYSTEM SET log_archive_min_succeed_dest = 1 SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size = 10G SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest = '/data/oracle/archivelog' SCOPE=BOTH;
要确保 /data/oracle/archivelog oracle容器里面的目录存在
然后重启数据:
SQL> shutdown immediate; ---- 先停止
Database closed.
Database dismounted.
ORACLE instance shut down.SQL> startup; ----再启动
ORACLE instance started.Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 419432560 bytes
Database Buffers 1174405120 bytes
Redo Buffers 7360512 bytes
Database mounted.
Database opened.SQL> show parameter recovery ---查看设置是否生效
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /data/oracle/archivelog
db_recovery_file_dest_size big integer 10G
recovery_parallelism integer 0
SQL>2025-03-05 回来修改 :以上归档设置的根据空间来自动清理的,导致清理不及时 会造成数据库无法连接情况
解决此错误:需要建立根据时间自动清理的脚本文件 参考以下图片内容
下面附上一些建表相关语句(参考用)
oracle 创建表空间 授权用户等命令
创建表空间 注意:(/data/oracle 表空间一定要在这个下面 因为此目录挂载到了宿主机 所以不在这儿会引起错误的 很麻烦)
CREATE TABLESPACE tablespace_my
DATAFILE '/data/oracle/data/tablespace_my.dbf' SIZE 512m
AUTOEXTEND ON NEXT 32m MAXSIZE 2048m
EXTENT MANAGEMENT LOCAL;创建用户
CREATE USER root IDENTIFIED BY 123456
DEFAULT TABLESPACE tablespace_my
TEMPORARY TABLESPACE temp
PROFILE DEFAULT;授权
GRANT CONNECT, RESOURCE TO root;
GRANT CREATE SESSION TO root;
GRANT CREATE TABLE TO root;
GRANT CREATE VIEW TO root;
如果需要授予用户DBA权限(请谨慎操作,因为这会赋予用户广泛的数据库管理权限):
GRANT DBA TO root;创建表
CREATE TABLE wms_question (
id NUMBER(19,0) NOT NULL,
no NUMBER(10,0) NOT NULL,
title VARCHAR2(255 CHAR) NOT NULL,
txt CLOB,
status CHAR(1 CHAR) NOT NULL,
del_flag CHAR(1 CHAR) DEFAULT '0' NOT NULL,
remark VARCHAR2(200 CHAR)
) TABLESPACE tablespace_my设置主键自增
ALTER TABLE wms_question
ADD CONSTRAINT pk_wms_question PRIMARY KEY (id);创建序列
CREATE SEQUENCE wms_question_seq START WITH 1 INCREMENT BY 1;创建触发器 查询序列每次自增1
CREATE OR REPLACE TRIGGER wms_question_trg
BEFORE INSERT ON wms_question
FOR EACH ROW
BEGIN
SELECT wms_question_seq.NEXTVAL INTO :new.id FROM dual;
END;
下面是创建好之后的一些操作记录(---------------可忽略)
[root@392b7517da3f oracle]# ls -l /usr/bin/sqlplus
lrwxrwxrwx 1 root root 59 Dec 21 09:19 /usr/bin/sqlplus -> /home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/sqlplus
[root@392b7517da3f oracle]#
[root@392b7517da3f oracle]#
[root@392b7517da3f oracle]#
[root@392b7517da3f oracle]#
[root@392b7517da3f oracle]#
[root@392b7517da3f oracle]# su oracle
[oracle@392b7517da3f ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sat Dec 21 09:29:06 2024
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> conn /as sysdba
Connected.
SQL>
SQL>
SQL>
SQL> alter user system identified by root;
User altered.
SQL> alter user sys identified by root;
User altered.
SQL> create user admin identified by root;
User created.
SQL> grant connect,resource,dba to admin;
Grant succeeded.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 402655344 bytes
Database Buffers 1191182336 bytes
Redo Buffers 7360512 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> SELECT log_mode FROM v$database;
LOG_MODE
------------
ARCHIVELOG
SQL> alter database open;
Database altered.
SQL> lsnrctl status
SP2-0734: unknown command beginning "lsnrctl st..." - rest of line ignored.
SQL> ALTER SYSTEM SET log_archive_max_processes = 4 SCOPE=BOTH;
System altered.
SQL> ALTER SYSTEM SET log_archive_min_succeed_dest = 1 SCOPE=BOTH;
System altered.
SQL> ALTER SYSTEM SET db_recovery_file_dest_size = 10G SCOPE=BOTH;
System altered.
SQL> ALTER SYSTEM SET db_recovery_file_dest = '/path/to/archivelog' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest = '/path/to/archivelog' SCOPE=BOTH
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-01261: Parameter db_recovery_file_dest destination string cannot be
translated
ORA-01262: Stat failed on a file destination directory
Linux-x86_64 Error: 2: No such file or directory
SQL> ALTER SYSTEM SET db_recovery_file_dest = '/data/oracle/archivelog' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest = '/data/oracle/archivelog' SCOPE=BOTH
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-01261: Parameter db_recovery_file_dest destination string cannot be
translated
ORA-01262: Stat failed on a file destination directory
Linux-x86_64 Error: 2: No such file or directory
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> cd /
SP2-0042: unknown command "cd /" - rest of line ignored.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> SQL>
SQL>
SQL>
SQL> SQL>
SQL>
SQL>
SQL> SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> ALTER SYSTEM SET db_recovery_file_dest = '/data/oracle/archivelog' SCOPE=BOTH;
System altered.
SQL>
SQL>
SQL>
SQL> SHOW PARAMETER db_recovery_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /data/oracle/archivelog
db_recovery_file_dest_size big integer 10G
如果重启之后导致数据库监听失败等原因 参考以下操作
服务器docker 进入oracle
检查环境变量 echo $ORACLE_HOME
echo $ORACLE_SID
echo $PATH
容器:/home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin
listener.ora 监听文件内容--------------- 远程链接时候可能需要
# listener.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
(SERVICE_NAME = helowin)
)
)
ADR_BASE_LISTENER = /home/oracle/app/oracle
tnsnames.ora 文件内容-----------------------
# tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_HELOWIN =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
HELOWIN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = helowin)
)
)
~
~
一,oracle容器命令 : docker exec -it -u root oracle11g bash 以root用户身份进入bash
二,启动挂载 : startup mount; "当你执行 STARTUP MOUNT; 命令时,Oracle 会完成以下操作:启动实例:初始化 SGA 并启动必要的后台进程。读取初始化参数文件:加载 init.ora 或 spfile 中的参数。挂载数据库:读取控制文件,并验证数据库的物理结构(如数据文件和重做日志文件的位置)。但是,它不会打开这些文件,因此用户还不能访问数据。"
三,su oracle,
sqlplus / as sysdba 命令进入
(
1. 确认所有控制文件
SQL> SHOW PARAMETER CONTROL_FILES;
2. 选择最新的控制文件"根据您的错误信息,/home/oracle/app/oracle/oradata/helowin/control01.ctl 版本为 1963,而 /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl 版本为 841。显然,control01.ctl 是较新的版本。"
3. 复制最新的控制文件 "为了确保一致性,您可以将最新的控制文件复制到其他位置。假设 control01.ctl 是最新的版本,可以将其复制到 control02.ctl 的位置:"
cp /home/oracle/app/oracle/oradata/helowin/control01.ctl /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl
4. 重新启动并挂载数据库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
# 开启归档日志,出现Database altered. 表示开启成功
SQL> alter database archivelog;
#查看归档状态
SQL> SELECT log_mode FROM v$database;
#打开数据库,一定要执行
SQL> alter database open;
)
本文地址:https://www.vps345.com/1358.html