环境:
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文件夹下,如下
添加内容如下
-
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
此时一路畅通,没踩到坑。。此时同样在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=数据库完全导出
同时因为在Oracle安装时就挂载文件到其他目录,所以此时在备份目录也可以同步看到
尚未停止。。。
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查询结果
这时候状态不再是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类型的数据无法导入
解决方案:保持表空间名称一致或者参照http://www.cnblogs.com/wangsaiming/p/4947151.html