环境:

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容器下

docker 迁移root docker 迁移oracle_SQL

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

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

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

docker 迁移root docker 迁移oracle_docker 迁移root_02

添加内容如下

     T =
    
           (DESCRIPTION =
       
         (ADDRESS_LIST =
             (ADDRESS = (PROTOCOL = TCP)(HOST = 
     
     192.168.xx.xxx)(PORT = 
     
     1521))
     
         )
    
     
         (CONNECT_DATA =
      
           (SERVICE_NAME = xxx)
      
         )
       
       )
 

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

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

docker 迁移root docker 迁移oracle_docker 迁移root_03

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

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

docker 迁移root docker 迁移oracle_docker 迁移root_04

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

docker 迁移root docker 迁移oracle_docker 迁移root_05

尚未停止。。。

2.1、导入数据库文件

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

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

     create 
     
     tablespace 
     
     test
       
     logging
    
         
     datafile 
     
     '/u01/app/oracle/xxx.dbf' 
       
     size 
     
     32m 
       
     autoextend 
     
     on 
    
  
     next 
     
     32m 
     
     maxsize 
     
     2048m
         
     extent 
     
     management 
     
     local; 

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

     select * 
     
     from dba_tablespaces;
    
      
     select file_name,online_status 
     
     from dba_data_files ;
   

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

     ERROR:
      ORA
     
     -01033: ORACLE initialization 
     
     or shutdown 
     
     in progress
    
       
     Process ID: 
     
     0
      
     Session ID: 
     
     0 Serial number: 
     
     0
 

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

    # ERROR:
      # ORA-01033: ORACLE initialization or shutdown in progress
      
     # Process ID: 0
       # Session ID: 0 Serial number: 0
     # 解决方法:使用sqlplus登录
       
     root@6d9e4ca51d51:/# sqlplus /nolog
        
     # 使用sys登录(system无法登陆)
         SQL>connect sys/password as sysdba
       
     SQL> shutdown normal
    
      
     ORA-01109: 数据库未打开
    
        
     已经卸载数据库。
    
        
     ORACLE 例程已经关闭。
    
        
     SQL> 
     
     start 
     
     mount
    
     
     SP2
     
     -0310: 无法打开文件 
     
     "mount.sql"
        
     SQL> 
     
     startup 
     
     mount
    
    
     ORACLE 例程已经启动。
   
     Total 
     
     System 
     
     Global Area  
     
     612368384 
     
     bytes
      
     Fixed 
     
     Size                  
     
     1332348 
     
     bytes
    
         
     Variable 
     
     Size             
     
     183151492 
     
     bytes
    
         
     Database Buffers          
     
     423624704 
     
     bytes
       
     Redo Buffers                
     
     4259840 
     
     bytes
    
     
     数据库装载完毕。
       SQL> 
     
     alter 
     
     database 
     
     open;
      
     alter 
     
     database 
     
     open
      
     *
     
     第 
     
     1 行出现错误:
   
     
     ORA
     
     -01157: 无法标识/锁定数据文件 
     
     5 - 请参阅 DBWR 跟踪文件
      
     ORA
     
     -01110: 数据文件 
     
     5: 
     
     'C:\TYKM.DBF'
             
     # 就在此处将不小心删除的文件状态设为
     
     offline
       
     SQL> 
     
     alter 
     
     database 
     
     datafile 
     
     5 
     
     offline 
     
     drop;【5是数据文件中的5】
    
      
     数据库已更改。
    
       
     SQL> 
     
     alter 
     
     database 
     
     open;【我们一直循环这个语句,直至不再提示错误】
    
    
     数据库已更改。
    
         
     SQL> shutdown normal
    
         数据库已经关闭。
    
    
     已经卸载数据库。
    
         ORACLE 例程已经关闭。
          
     SQL> startup
         ORACLE 例程已经启动。
      
     Total System Global Area  612368384 bytes
      
     Fixed Size                  1332348 bytes
       
     Variable Size             187345796 bytes
         
     Database Buffers          419430400 bytes
       
     Redo Buffers                4259840 bytes
   

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

docker 迁移root docker 迁移oracle_服务器_06

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

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

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

imp导入命令

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

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

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

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

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

编码修改成功!

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

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

解决方案:保持表空间名称一致