接上篇:Linux服务器使用Docker安装Oracle12c
环境:
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,然后修改
刘大佬指导,同样可以通过进入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文件夹下,如下
添加内容如下
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,命令为
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)
猜测是因为新装数据库与原数据库编码不同,因为所有表都来自原封不动导出的文件
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;
成功!