docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
#容器启动
docker run -di --name oracle11521 --restart=always \
-p 1521:1521 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
# 创建文件夹
mkdir -p /home/esopadm/data/oracle
#复制文件出来
docker cp oracle11521:/home/oracle/app/ /home/esopadm/data/oracle
docker cp oracle11521:/etc/profile /home/esopadm/data/oracle/
cd /home/esopadm/data/oracle
# 500 500 是容器内 oracle 组和用户的 id
chown -R 500.500 app
# 删除容器
docker rm -f oracle11521
docker run -d -p 11521:11521 -v /home/esopadm/data/oracle/app:/home/oracle/app \
-v /home/esopadm/data/oracle/profile:/etc/profile \
--restart=always --name oracle11521 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
docker exec -it oracle /bin/bash
这个命令就是我噩梦的开始,由于我用的是公司的开发环境的服务器,别人已经事先装过oracle了,所以我上面那个命令进入的是别人oracle,导致下面执行的命令都是在别人地盘上玩的,白白浪费了好长时间,所以我只能改个端口号继续玩,那容器名也不能一样了,我把端口改成了11521,容器名为oracle11521。
那正确的命令应该是下面这个
docker exec -it oracle11521 /bin/bash
su root
#密码: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
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
su - oracle
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;
exit 退出
上面简单的三步我这就开始报错了,下面是我遇到的错误及解决办法
提示数据库没有打开,不急按如下操作
输入:alter database open;
输入:alter database mount;
这个解决方法很多,我只用了其中一个,想看其他方法,查看这篇文章:https://blog.csdn.net/Ruishine/article/details/115323525
由于control102.ctl版本号是845比control101.ctl版本号841高,所以我将control101.ctl删除,然后将control102.ctl拷贝到control101.ctl目录下并改名为control101.ctl。
也就是说用高版本的覆盖低版本的
lsnrctl status
服务名:helowin(一定要填写helowin)
用户名:system 第10步设置的用户)
密码:123456(第10步设置的密码)
终于大功告成了,这回开始使用吧。。。结果。。。
这个错误卡了我很久,我也不能每次都指定ip吧,其他同事用我再把他们ip加上?太蠢了。最后终于找到一个靠谱的
修改/home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora文件里的host
HOST默认是localhost ,本机连接正常,远程无法连接。改为机器名,本地、远程都可以连接!
那我们就通过hostname查看主机名呗。
注意:是容器的主机名,而不是宿主机的。
修改完需要重新开启监听。先停止,再启动。
lsnrctl stop
lsnrctl start
大概意思是当前服务不可用
结果又是一顿瞎搞,结果lsnrctl status命令显示的内容和以前又不一样了,没有可用的服务。
这个问题也找到解决办法了。
继续修改listener.ora 文件。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = helowin)
(SID_NAME = helowin)
)
)
继续lsnrctl stop然后lsnrctl start
熟悉的服务、实例终于又回来了。
权限不足???
这个简单查了一下
解决Navicat连接Oracle数据库用户权限问题:
第一步:在cmd窗口运行[sqlplus],
第二步:输入Oracle的用户名和口令连接Oracle数据库,
第三步:执行授权代码,给用户授予DBA权限 [grant dba to 用户名;],
如果还有权限不足问题再执行第四步,
第四步:执行[grant all privileges to 用户名;]
我这里用户名就是system了,执行完了没什么鸟用。
后来想起来了,之前蒙头撞墙的时候改了高级里的角色为sysdba,改回default试一下。
居然成功了!!!
就这样吧。洗洗睡吧。真的累了。