二、docker中的oracle12c数据库进行dmp数据迁移

环境:

Centos7.5

使用Docker安装的Oracle

要对同一内网下装有Oracle的两台服务器数据迁移(导出与导入),使用exp和imp命令

1、将服务器A内数据库中的数据使用exp导出到服务器B数据库目录下

2、将导入到服务器B目录下的dmp文件使用imp导入服务器B上的数据库内

首先在服务器B上需要配置一个tnsname,然后使用tnsping测试B是否能够连接到服务器A上的数据库,这是所有操作的起点与基础

操作如下:

1.1、导出数据库文件

全局搜索tnsnames.ora文件,Linux命令:

find / -name tnsnames.ora
  
  

然后在Docker容器下

目测diff文件是差异文件夹,暂时直接使用的

/var/lib/docker/overlay2/ce41d80b81d5160e26c3e5017c4cf95ad429603e9023d27fc593b497de9134d5/merged/u01/app/oracle-product/12.1.0/xe/network/admin/samples/tnsnames.ora
  
  

大佬指点,sample文件是示例目录,故新建一个tnsnames.ora在admin文件夹下,如下

添加内容如下


  
  
  1. T =
  2. (DESCRIPTION =
  3. (ADDRESS_LIST =
  4. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xx.xxx)(PORT = 1521))
  5. )
  6. (CONNECT_DATA =
  7. (SERVICE_NAME = xxx)
  8. )
  9. )

后面命令行进入Oracle容器进行测试


  
  
  1. # 查看所有在运行的容器
  2. docker ps
  3. # 使用返回的容器ID进入容器命令行
  4. docker exec -it 7485d22f2fd5 /bin/bash 运行容器
  5. # 如果进入root@ 62a5a35737c1:/#类似这种容器内命令行则表示成功,此时进入Oracle容器,可使用Oracle自
  6. # 带SQLPlus等,tnsping也是Oracle自带的Oracle Net 工具,可以
  7. # 1)验证名字解析(tnsnames.ora内配置的Service)
  8. # 2)远程的listener是否启动
  9. # 验证是否连接到服务器A的Oracle
  10. tnsping X

此时一路畅通,没踩到坑。。此时同样在Oracle容器内,执行exp


  
  
  1. exp account/password @tnsName file=/u01/app/oracle/file.dmp log=/u01/app/oracle/file.log full=y
  2. # exp 服务器A上数据库账号/密码@本地服务器B配置的tnsnames.ora内的name file=导出路径(此处为Oracle容器内相对路径) log=日志路径(相对路径+ 1) full=数据库完全导出

同时因为在Oracle安装时就挂载文件到其他目录,所以此时在备份目录也可以同步看到

尚未停止。。。

2.1、导入数据库文件

在导入数据库dmp前,需创建表空间、用户、修改Oracle编码

之前测试挂载是否成功时创建了一个tablespace,命令如下:每32M进行数据文件扩展,单个数据文件最大2G


  
  
  1. create tablespace test
  2. logging
  3. datafile '/u01/app/oracle/xxx.dbf'
  4. size 32m
  5. autoextend on
  6. next 32m maxsize 2048m
  7. extent management local;

后来shoucan,直接删除了xxx.dbf文件,但是根据


  
  
  1. select * from dba_tablespaces;
  2. select file_name,online_status from dba_data_files ;

查询出路径还在,且想要drop tablespace时,一直提示无法找到文件,使用重启大法:后果如下


  
  
  1. ERROR:
  2. ORA -01033: ORACLE initialization or shutdown in progress
  3. Process ID: 0
  4. Session ID: 0 Serial number: 0

Oracle无法正常启动,百度中求生:oracle initialization or shutdown in progress解决方法


  
  
  1. # ERROR:
  2. # ORA-01033: ORACLE initialization or shutdown in progress
  3. # Process ID: 0
  4. # Session ID: 0 Serial number: 0
  5. # 解决方法:使用sqlplus登录
  6. root@6d9e4ca51d51:/# sqlplus /nolog
  7. # 使用sys登录(system无法登陆)
  8. SQL>connect sys/password as sysdba
  9. SQL> shutdown normal
  10. ORA-01109: 数据库未打开
  11. 已经卸载数据库。
  12. ORACLE 例程已经关闭。
  13. SQL> start mount
  14. SP2 -0310: 无法打开文件 "mount.sql"
  15. SQL> startup mount
  16. ORACLE 例程已经启动。
  17. Total System Global Area 612368384 bytes
  18. Fixed Size 1332348 bytes
  19. Variable Size 183151492 bytes
  20. Database Buffers 423624704 bytes
  21. Redo Buffers 4259840 bytes
  22. 数据库装载完毕。
  23. SQL> alter database open;
  24. alter database open
  25. *
  26. 1 行出现错误:
  27. ORA -01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件
  28. ORA -01110: 数据文件 5: 'C:\TYKM.DBF'
  29. # 就在此处将不小心删除的文件状态设为 offline
  30. SQL> alter database datafile 5 offline drop;【5是数据文件中的5】
  31. 数据库已更改。
  32. SQL> alter database open;【我们一直循环这个语句,直至不再提示错误】
  33. 数据库已更改。
  34. SQL> shutdown normal
  35. 数据库已经关闭。
  36. 已经卸载数据库。
  37. ORACLE 例程已经关闭。
  38. SQL> startup
  39. ORACLE 例程已经启动。
  40. Total System Global Area 612368384 bytes
  41. Fixed Size 1332348 bytes
  42. Variable Size 187345796 bytes
  43. Database Buffers 419430400 bytes
  44. Redo Buffers 4259840 bytes

启动完成后执行上方的tablespace查询结果

这时候状态不再是ONLINE,再次drop tablespace即可成功


  
  
  1. # 删除名为tpms的文件及关联的datafiles
  2. drop tablespace tpms including contents and datafiles;

另外在创建表空间的时候,单个表空间不能大于32G

imp导入命令


  
  
  1. imp tpms/Tpms2015 fromuser=tpms touser=tpms file= /u01/app /oracle/tpms20181127.dmp log= /u01/app /oracle/tpms20181127.log ignore=y;
  2. # imp 要导入数据库的用户名/密码 fromuser=从用户 touser=到用户 file=原导出的dmp数据文件 log=日志文件 ignore=忽略错误

另外在dmp导入报错value too large for column (actual: 27, maximum: 20)

猜测是因为新装数据库与原数据库编码不同,因为所有表都来自原封不动导出的文件

来自修改oracle的编码格式,解决乱码问题:


  
  
  1. 1、管理员用户连接
  2. SQL>conn sys/密码 as sysdba;
  3. 2、关闭数据库。
  4. SQL>shutdown immediate;
  5. 3、启动数据库到Mount状态下。
  6. SQL> STARTUP MOUNT;
  7. # 这些都要执行,以修改状态
  8. SQL> ALTER SESSION  SET SQL_TRACE= TRUE;
  9. Session altered.
  10. SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
  11. System altered.
  12. SQL> ALTER SYSTEM  SET JOB_QUEUE_PROCESSES= 0;
  13. System altered.
  14. SQL> ALTER SYSTEM  SET AQ_TM_PROCESSES= 0;
  15. System altered.
  16. 4、启动数据库
  17. SQL> Alter database open;
  18. 5、修改字符集
  19. # 需要使用INTERNAL_USE来使跳过 新字符集必须为旧字符集的超集 的检查
  20. SQL> ALTER DATABASE CHARACTER  SET ZHS16GBK;
  21. 或 ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
  22. 6、关闭数据库
  23. SQL> Shutdown immediate;
  24. 7、重新启动数据库
  25. SQL> startup;

编码修改成功!

导入dmp过程中可能遇到的错误:

1.表空间不一致,如果源数据库的表空间和目标数据库表空间不一致,则clob和blob类型的数据无法导入

解决方案:保持表空间名称一致或者参照http://www.cnblogs.com/wangsaiming/p/4947151.html

猜你喜欢

转载自blog.csdn.net/ljq354004063/article/details/84618577
今日推荐