一、docker安装教程很多便不赘述
二、docker导入dmp文件
1. 拉取oracle镜像,此处选取registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g镜像
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
2. 启动oracle镜像
docker images 查看已有镜像 获取容器id
启动oracle镜像
docker run -d -p 1521:1521 -v /docker-data/oracle:/data/oracle -v 如果数据大,请挂载你的数据文件夹--device-read-bps /dev/sdb:10000MB --device-write-bps /dev/sdb:10000MB --name oracle11 registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
注意:如果你要处理的文件数量巨大,如200g这种规模,在此步中多加一个 -v 把你的服务器中的数据文件夹挂载到docker中。否则会导致docker容量饱满,从而功亏一篑。
挂载了数据文件夹不需要进行下一步的拷贝了。
3.拷贝你的dmp文件到docker中
docker cp /home/xxx/data_xxx.dmp 你的镜像id:/home/data_xxx.dmp
4.进入docker容器
docker exec -it 你的镜像id bash
5.进入root用户修改profile文件
su root
password: helowin
vi /etc/profile
source /etc/profile
需要将oracle路径以及相关信息加入到你的环境变量中
将以下内容加入你的/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
然后点击profile执行。 source /etc/profile
6. 回到oracle用户 su oracle
7.进入 sqlplus
注意* 此时的sqlplus是不能用backspace的,上下左右方向键也用不了,复制粘贴单行可以,多行就完蛋了,需要安装一个rlwrap插件,安装过程见下一节。
sqlplus /nolog
conn /as sysdba
sqlplus中:
create temporary tablespace TEST_DBF_TEMP tempfile '/home/oracle/data/TEST_DBF_TEMP.dbf' size 50m autoextend on next 50m maxsize 2048m;
create tablespace TEST_DBF datafile '/home/oracle/data/TEST_DBF.dbf' size 50M autoextend on next 50m maxsize 2048m;
create user TEST identified by "123" default tablespace TEST_DBF temporary tablespace TEST_DBF_TEMP;
grant create session,connect,resource,dba to TEST;
使用这里创建好的USER和密码进行后面的 imp 导入dmp文件
致谢:【Docker】Linux 服务器 Docker安装Oracle数据库_旋转跳跃后空翻中的阿喵 - 热爱,专注,精益求精-CSDN博客
8. 在docker中 导入dmp文件:
导入命令:
nohup imp TEST/123 file =./your_dmp_data.dmp full=y buffer= 812000000 > log.out &
我的dmp文件导入过程中需要建两个新的表空间,并且文件数量很大,需要对表空间追加数据文件,提供以下代码:
建表空间:
create tablespace YOUR_TABLE_SPACE datafile '/home/oracle/data/YOUR_TABLE_SPACE .dbf' size 50M autoextend on next 50m maxsize unlimited;
增加数据文件:
alter tablespace YOUR_TABLE_SPACE add datafile '/home/oracle/data/YOUR_TABLE_SPACE.dbf' size 50m autoextend on next 50m maxsize unlimited;
根据你的表大小适当增加数据文件。
Oracle默认分配的为8K,也就是对应于32768M左右的空间大小,如果想继续增大表空间的话,只需要通过
alter tablespace name add datafile ‘path/file_name’ size 1024M;
添加数据文件的方式就可以了。
致谢:https://www.jianshu.com/p/8ddd5e529339
如果过程中有问题需要重新导入需要删除已经创建的表空间
删除表空间:
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
停止docker
docker stop container_id
删除docker
docker rm container_name
三、安装rlwrap插件
1.安装 readline,readline-devel
先安装这readline,readline-devel两个组件,这个docker中自带了yum,但是不能安装这两个库,我们需要重新配置一下yum。
如果执行会报如下错误
[root@your_container_id oracle]# yum install readline
Loaded plugins: fastestmirror
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
执行以下命令
sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
yum clean all
yum makecache
执行yum makecache时候会报错
Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify its path and try again
然后vi /etc/yum.repos.d/epel.repo 将所有enabled=1改成enabled=0
然后再执行yum makecache
此时再执行
yum install readline
yum install readline-devel
这两行代码是没有问题的啦
致谢All mirror URLs are not using ftp, http[s] or file.centos6-杂货铺-悠然小屋 安然之家 (csuper.cn)
2. 安装rlwrap插件 懒得去官网找的直接下载我的百度网盘
链接:https://pan.baidu.com/s/13pHn91yxpJj72oCFcZQtAw
提取码:v5ps
复制这段内容后打开百度网盘手机App,操作更方便哦
把插件传到docker里面然后执行以下命令
tar -zxf rlwrap-0.37.tar.gz
cd rlwrap-0.37
./configure
make
make check
make install
alias sqlplus="rlwrap sqlplus"
然后使用sqlplus 就可以使用退格各种方向键随便复制粘贴了。
致谢:解决linux下使用sqlplus编辑不方便的问题_congkuzhang2348的博客-CSDN博客
linux安装rlwrap_huryer的专栏-CSDN博客
四、oracle数据库导出CSV文件
安装好rlwrap插件之后,就可以在sqlplus里面随便复制粘贴了
1. conn TEST/123 登录TEST账户(imp导入的时候用的是这个账户)
2.首先创建存储一个保存到csv的过程,如下,直接复制粘贴即可
CREATE OR REPLACE PROCEDURE SQL_TO_CSV
(
P_QUERY IN VARCHAR2,
P_DIR IN VARCHAR2,
P_FILENAME IN VARCHAR2
)
IS
L_OUTPUT UTL_FILE.FILE_TYPE;
L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
L_COLUMNVALUE VARCHAR2(4000);
L_STATUS INTEGER;
L_COLCNT NUMBER := 0;
L_SEPARATOR VARCHAR2(1);
L_DESCTBL DBMS_SQL.DESC_TAB;
P_MAX_LINESIZE NUMBER := 32000;
BEGIN
--OPEN FILE
L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);
--DEFINE DATE FORMAT
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
--OPEN CURSOR
DBMS_SQL.PARSE(L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS(L_THECURSOR, L_COLCNT, L_DESCTBL);
--DUMP TABLE COLUMN NAME
FOR I IN 1 .. L_COLCNT LOOP
UTL_FILE.PUT(L_OUTPUT,L_SEPARATOR || '"' || L_DESCTBL(I).COL_NAME || '"');
DBMS_SQL.DEFINE_COLUMN(L_THECURSOR, I, L_COLUMNVALUE, 4000);
L_SEPARATOR := ',';
END LOOP;
UTL_FILE.NEW_LINE(L_OUTPUT);
--EXECUTE THE QUERY STATEMENT
L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);
--DUMP TABLE COLUMN VALUE
WHILE (DBMS_SQL.FETCH_ROWS(L_THECURSOR) > 0) LOOP
L_SEPARATOR := '';
FOR I IN 1 .. L_COLCNT LOOP
DBMS_SQL.COLUMN_VALUE(L_THECURSOR, I, L_COLUMNVALUE);
UTL_FILE.PUT(L_OUTPUT,
L_SEPARATOR || '"' ||
TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE, '"', '""')) || '"');
L_SEPARATOR := ',';
END LOOP;
UTL_FILE.NEW_LINE(L_OUTPUT);
END LOOP;
--CLOSE CURSOR
DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
--CLOSE FILE
UTL_FILE.FCLOSE(L_OUTPUT);
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
/
3.保存到csv 执行以下代码
create or replace directory OUT_PATH as '/home/';
EXEC SQL_TO_CSV('select * from your_table_name','OUT_PATH','your_output_Filename.csv');
大功告成!
致谢: oracle导出数据到 csv文件方法整理_捉到一只萤火虫的博客-CSDN博客
任何问题欢迎留言讨论