Mac电脑通过docker安装oracle,并导入数据

一、Mac中Docker的部署
首先,你需要在Mac中部署Docker,也就是安装Docker。安装Docker分了两种途径,一种是通过terminal终端并下载相关依赖包进行安装,另一种是通过下载dmg格式的安装包直接对Docker进行安装。我推荐使用第二种方式来安装Docker,本片博文也是基于此种方式进行的讲解,希望各位熟知。因为第一种安装Docker的方式会让我们自己再配置一些Docker的基本配置,对于不懂的小白来说,不太现实。
【Mac电脑通过docker安装oracle,并导入数据】Docker桌面版本提供了用户GUI界面的支持,使用户对Docker的相关配置直接通过界面即可,不过是英文的,不用再写其他和配置有关的命令,部分截图如下:
安装成功之后会在Mac中显示出Docker的Logo。
Mac电脑通过docker安装oracle,并导入数据
文章图片
同时会在Mac顶部菜单栏中出现Docker的Logo,点击它,如下图:


Mac电脑通过docker安装oracle,并导入数据
文章图片
在成功安装完Docker桌面版之后,Docker会默认启动并默认开机启动,当你在菜单栏中发现Docker Desktop is running时,说明你的Docker桌面版已经安装成功了,我们进行接下来的操作。
二、通过Docker来安装Oracle11g (1)Docker是一个容器,在容器内部存在很多镜像文件,通过具体的镜像文件可以运行具体的容器。要想在Docker中安装Oracle镜像,我们首先应该在Docker的远程仓库中进行搜索,因为Docker没有自带Oracle相关镜像,命令如下(根据你Mac的实际情况决定是否要加sudo):
sudo docker search docker-oracle-xe-11g
Mac电脑通过docker安装oracle,并导入数据
文章图片
为什么选择该Oracle镜像,因为该镜像是我在安装了两三个Oracle镜像之后发现的占用内存最小,功能最全,安装简便的镜像,前前后后我换了两三个镜像,碰到过5.7GB的,碰到过4.2GB的,只有这个是2.7GB的,而且功能还全。搜索结果如下:
我们选择第一个STAR最多的一个镜像进行安装,拉取镜像命令如下:
sudo docker pull deepdiver/docker-oracle-xe-11g


Mac电脑通过docker安装oracle,并导入数据
文章图片
Mac电脑通过docker安装oracle,并导入数据
文章图片


因为我已经安装过了,所以这里就不再展示了,只需要等待镜像下载完毕就可。待镜像下载完毕之后,我们需要将该镜像转成容器并使用该容器,命令如下:
sudo docker run -d -p 1521:1521 --name oracle11g deepdiver/docker-oracle-xe-11g


Mac电脑通过docker安装oracle,并导入数据
文章图片
值得注意的就是将容器内部的1521端口映射到宿主机中的1521端口,这样一来就能在宿主机中通过Navicat等数据库可视化管理工具进行连接了。在这步完成之后,我们需要进到容器内部对已经安装的Oracle进行简单配置。
(2)在Oracle容器中简单配置你的Oracle数据库并通过Navicat进行连接
进入容器内部的命令如下:
sudo docker exec -it你的容器Id(可通过docker ps命令获得)/bin/bash
通过sqlplus进入Oracle:
sqlplus system/oracle
依次进行如下操作:
查看数据库用户名和密码:
select username,password from dba_users;
当然,你可以通过已经存在的用户名和密码来登录数据库,推荐使用新创建的用户来进行数据库的登录,sql如下:
create user cqj(用户名) identified by password(密码)
创建完之后,可以通过如下sql进行验证:
select * from all_users;
在创建完新用户之后,需要对该用户进行授权,该用户具有什么权限都是通过自己指定的,这也是为什么推荐使用自定义用户登录数据库的原因,sql如下:
grant connect,resource to CQJ(这里需要将用户名大写,否则授权不成功)
connect表示具有连接数据库的权限;resource表示具有操作数据库的权限
至此,所有需要配置的数据库配置都已经配置完毕,可以通过Navicat进行连接了,如下图所示:


几个需要注意的地方:
主机就是localhost或127.0.0.1
端口为docker内部Oracle容器映射到宿主机的端口,上述命令有将,我的是映射到1521端口
选择服务名进行连接,并且该版本Oracle数据库的服务名为XE(唯一)
角色选择默认就行
用户名和密码就是我们在上述创建的用户名和密码
在配置完上述内容之后,点击连接测试,即可连接成功:


Mac电脑通过docker安装oracle,并导入数据
文章图片
至此,所有的操作都已经完成了,赶快在你的Mac上使用Oracle吧!!
三、用sys用户登录 1.用sys超级管理员用户登录
sqlplus / as Sysdba;
2.创建oracle数据库逻辑目录
create directory datadump as '/datadump';
3.创建cqj用户并授权(上面已经创建过,此步骤在这里省略)
create user cqj identified by cqj; grant dba to cqj;
4.给cqj用户对datadump文件的读写权限
grant write,read on directory datapump to cqj;
四、在docker容器中创建目录并将dmp文件备份到容器中 1.在容器中创建目录datadump
mkdir datadump
2.将dmp文件备份到datadump目录下
sudo docker cp /Users/XXX/Desktop/cqj_20191231.dmp993746984ba6(容器的id,可通过docker ps查询):/datadump/cqj.dmp
3.导入成功后,查看一下文件的详细信息
ls -l
Mac电脑通过docker安装oracle,并导入数据
文章图片
如果该文件不是oracle dba操作的权限,可进行修改
在root账户登录下: chown oracle:dba cqj.dmp
4.导入数据泵命令
impdp cqj/cqj directory=datadump dumpfile=cqj.dmp transform=segment_attributes:n table_exists_action=replace logfile=cqj.log
5.如果导入的表太大,担心表空间不够的时候,可以适当的增加表空间
先查询一下该用户使用的哪个表空间
-- 查看当前用户的缺省表空间
select * from user_users;
因为我使用的表空间是SYSTEM,所以,增大表空间的命令如下:
ALTER TABLESPACE SYSTEM(表空间)ADD DATAFILE'/u01/app/oracle/oradata/XE
/system2.dbf'(文件存放位置)SIZE 1024M AUTOEXTEND ON NEXT 1024M MAXSIZE 30720M;


查看数据库表空间使用情况:
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,SPACE-NVL(FREE_SPACE,0) "USED_SPACE(M)",
ROUND((1-NVL(FREE_SPACE,0)/SPACE)*100,2) "USED_RATE(%)",FREE_SPACE "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME order by TABLESPACE_NAME) F
WHERED.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL--if have tempfile
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2) "USED_RATE(%)",
NVL(FREE_SPACE,0) "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,
ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERED.TABLESPACE_NAME = F.TABLESPACE_NAME(+);

    推荐阅读