构建Oracle镜像
📌 构建19C镜像
准备好Dockerfile,构建镜像并运行容器。19C镜像需要2G以上磁盘空间,pull和首次运行都需要一段时间。
FROM registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
# 数据库实例
ENV ORACLE_SID=ORCLCDB
# 多租户架构下的一个容器数据库
ENV ORACLE_PDB=ORCLPDB1
ENV ORACLE_PWD=123456
ENV ORACLE_EDITION=standard
ENV ORACLE_CHARACTERSET=AL32UTF8
# 持久化数据卷
VOLUME /opt/oracle/oradata
docker build -f Dockerfile_Oracle -t my-oracle .
# 注意当前路径
docker run -d -p 49524:1521 -p 55502:5500 --name my-19c -v ${pwd}:/opt/oracle/oradata my-oracle
--部署完成后用sqlplus检查服务是否正常运行
--最高权限的 SYS 用户登录
sqlplus / as sysdba
📌 在指定pdb中创建用户
--最高权限的 SYS 用户登录
sqlplus / as sysdba
--确保已连接到ORCLPDB1(Dockerfile配置的ORACLE_PDB)
ALTER SESSION SET CONTAINER = ORCLPDB1;
--在ORCLPDB1中创建用户WHM
CREATE USER WHM IDENTIFIED BY WHM;
--为用户分配默认表空间和临时表空间(假设users是默认表空间,temp是临时表空间)
ALTER USER WHM DEFAULT TABLESPACE users QUOTA UNLIMITED ON users CONTAINER = CURRENT;
ALTER USER WHM TEMPORARY TABLESPACE temp CONTAINER = CURRENT;
--授权,授予用户在当前PDB中的权限
GRANT create user, drop user, alter user TO WHM CONTAINER = CURRENT;
GRANT create any view, connect, resource, dba TO WHM CONTAINER = CURRENT;
GRANT create session, create any sequence TO WHM CONTAINER = CURRENT;
COMMIT;
--撤销授权则是
--REVOKE SELECT, UPDATE, INSERT, DELETE ON TABLE_NAME FROM WHM;
补充
12c及更高版本,若要建公共用户,则用户名需要以C##开头+username命名。
📌 在宿主机使用oracledb连接
import oracledb
class DBUtil:
def __init__(self):
self.conn = oracledb.connect(r'WHM/WHM@127.0.0.1:49524/ORCLPDB1')
self.cursor = self.conn.cursor()
def select_data(self, sql: str) -> list:
# SQL语句去掉分号,否则报错ORA-00911
if sql.strip().endswith(';'):
sql = sql.strip()[:-1]
rows = self.cursor.execute(sql).fetchall()
return rows
def db_close(self):
self.cursor.close()
self.conn.close()
if __name__ == '__main__':
mydb = DBUtil()
sql = 'select sysdate from dual'
print(mydb.select_data(sql))
mydb.db_close()
控制台打印:[(datetime.datetime(2024, 1, 15, 14, 7, 23),)],没得问题。
参考资料: