和MySQL对比
大小写: oracle 本身不区分大小写 (会把关键字全部转为大写再执行),但是对引号里的字符区分大小写。
主键自增: oracle 没有自带的主键自增, 需要先创建一个序列, 再创建一个触发器, 来实现主键自增
相关命令
1 | 查看当前用户所有序列 |
基操
1 | 查版本 |
Docker Alpine安装oracle客户端
进入docker容器
1
2
3docker run -it --name=容器名 镜像名:latest /bin/sh 由镜像创建容器并进入(只有镜像无容器)
或
docker exec -it 容器名 /bin/sh 直接进入运行中的容器安装必要包
1 | apk add libaio, libnsl, unzip |
- 下载解压oracle basic包
需要对应服务器版本, 命令
select * from v$version;各版本下载地址(32位): https://www.oracle.com/database/technologies/instant-client/linux-x86-32-downloads.html
各版本下载地址(64位): https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
1 | 下载basic免安装zip包, 需要登录验证, 所以下载链接不能复用, 要在上面链接中找对应版本下载 |
unzip End-of-central-directory signature not found: 多半是下载的文件有问题, 重新下载就可以
- 添加环境变量
1 | 通过查看 /etc/profile 可以看到会加载 /etc/profile.d/目录下的 .sh结尾的文件 |
注: 这里会有很多奇怪的报错, 以下为作者碰到的
报错1. Error loading shared library /usr/local/oracle/lib/libclntsh.so: No such file or directory
(一开始是打算用软链接的, 但是没用, 直接复制就可以了, 不知道为什么)
1
2 mkdir /usr/local/oracle/lib
cp /usr/local/oracle/libclntsh.so.11.1 /usr/local/oracle/lib/libclntsh.so如果经过以上操作扔有此报错, 且是用supervisor启动的, 可能是因为supervisor没读到环境变量, 需要在supervisor配置文件中添加
1
2 environment=ORACLE_HOME="/usr/local/oracle",NLS_LANG="AMERICAN_AMERICA.AL32UTF8",LD_LIBRARY_PATH="/usr/local/oracle"注: supervisor添加环境变量时, 多个变量以
,分隔, 单个变量多个值以:分隔报错2.
Error loading shared library libnsl.so.1: No such file or directory (needed by /usr/local/oracle/lib/libclntsh.so
(libnsl.so.1 或 libnsl.so) 建对应软链接
1
2 ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1
ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so报错3: cx_Oracle.DatabaseError: ORA-21561: OID generation faile
这是hosts文件有问题
1
2 hostname # 查看当前hostname
把当前hostname加入到 /etc/hosts 文件的 127.0.0.1 即可
- 提交镜像
1 | docker commit -a 'laowang' 容器名 镜像名:1.0.0 |
- 换docker启动用的镜像版本号
注: 最后会发现环境变量没有加载, 原因未知
绕路解决方法:
- 通过DockerFile直接运行容器的项目: 修改
Dockerfile文件, 例:CMD source /etc/profile && gunicorn ....- 通过DockerCompose启动的项目: 修改
docker-compose.yml文件 例:command: /bin/sh -c "source /etc/profile && gunicorn ...."python 直连测试代码
import cx_Oracle
conn = cx_Oracle.connect(“user/passwd@host/instance”)
报错
报错ORA-00904: 后查到是数据库字段写错了, 和模型类的不一致
索引失效(partition of such index is in unusable state):
select index_name,status from user_indexes; # 查失效索引 alter index SYS_C00164313 rebuild; # 重建索引