环境:

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而是在linux搜索是想将路径直接复制到xftp,然后修改

docker 迁移wiki docker 迁移oracle_服务器

刘大佬指导,同样可以通过进入Oracle容器内进行搜索(在已知正在运行容器ID的情况下)

docker ps 
docker exec -it 7485d22f2fd5 /bin/bash
find / -name tnsnames.ora

目测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 迁移wiki docker 迁移oracle_Oracle_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 迁移wiki docker 迁移oracle_服务器_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 迁移wiki docker 迁移oracle_SQL_04

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

docker 迁移wiki docker 迁移oracle_数据库_05

尚未停止。。。

2.1、导入数据库文件

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

之前测试挂载是否成功时创建了一个tablespace,命令为

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 迁移wiki docker 迁移oracle_docker 迁移wiki_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;

成功!