这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
前言
- 在线音乐戳我呀!
- 音乐博客源码上线啦!
- 前几篇讲了Docker的安装部署,操作算说比较简单的。
- 接下来将分享如何将服务器A的数据库迁移(导入)到服务器B的数据库中,一五一十盘出。
- Are you ready ?
上个星期去了韶关云门寺拜香。烟雾缭绕仿佛想起在仙界的日子。怀念呀~
将服务器A的oracle数据库导入到服务器B的数据库中
-
如何创建表空间?
-
如何创建用户?
-
开始导入。
导入数据库的时候,不是说创建用户、数据库,就想直接导入。
oracle和mysql的不同之处就是:oracle有表空间。
所以别忘记先创建表空间。
环境
-
数据库:Oracle
-
服务器:Oracle数据库是在Docker中运行
一、如何创建表空间?
1.1 创建文件夹给表空间文件存放
在/home/oracle下创建tablespace文件夹。
mkdir /home/oracle/tablespace
1.2 创建表空间
表空间分两种,有临时和常规两种类型。
- 创建临时表空间TEST_TEMP
CREATE TEMPORARY TABLESPACE TEST_TEMP
TEMPFILE '/home/oracle/tablespace/TEST_TEMP.DBF'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL;
- 创建表空间TEST
CREATE TABLESPACE TEST
LOGGING
DATAFILE '/home/oracle/tablespace/TEST.DBF'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL;
二、如何创建用户?
创建用户test,密码是123456
CREATE USER test IDENTIFIED BY 123456
ACCOUNT UNLOCK
DEFAULT TABLESPACE TEST
TEMPORARY TABLESPACE TEST_TEMP;
赋予用户权限。
GRANT CONNECT,RESOURCE TO ithinkdt;
GRANT DBA TO ithinkdt;(可选,DBA为数据库管理员权限)
那现在我不小心创建用户了,但我想重新给这个用户指定表空间,那应该怎么做?
alter user username default tablespace userspace;
# 例子:给u1指定syg表空间。
alter user u1 default tablespace syg;
三、开始导入
前期工作(表空间、用户)已准备好,进行导入工作。
3.1 理清步骤
需求是:将服务器A的数据库导入到服务器B的数据库中。
那肯定有A数据库的dmp文件吧,先把dmp文件上传到服务器B中,然后再拷贝到Docker的Oracle容器中。
3.2 如何将dmp文件拷贝到oracle容器中?
命令是:docker cp /服务器文件路径 容器id:/存放路径
3.3 导入
Oracle容器中已经有dmp文件了,这时我们进入Oracle容器中,切换成root用户,执行导入数据库的命令。
忘记进入Oracle容器的朋友,请戳:实战篇:Oracle不会部署?来,教你玩
导入dmp文件的命令:
imp test/123456@39.542.126.84:1521/hellowinxDB file=/home/data.dmp full=y;
参数说明
-
imp
:- 导入的命令,它的兄弟导出是exp。
-
test/123456
:- 用户名/密码。
-
39.542.126.84:1521/hellowinxDB
:-
服务器ip:端口号/实例名。
-
注意前面是用@符号来连接的。
-
-
file=/home/data.dmp
:- dmp文件的路径。
-
full=y
:-
导入文件中全部内容,有可能有多个用户的内容。
-
导出除ORDSYS,MDSYS,CTXSYS,ORDPLUGINS,LBACSYS 这些系统用户之外的所有用户的数据。
-
如果你联接的用户默认使用的表空间设置成system,则导入文件的内容会导到system上。
-
3.4 可能会导入失败。
如果运气好,那就没这一步了,但如果导入失败的朋友,请继续往下看。
导入失败的其中一个原因:版本问题。
查看数据库版本是多少:
select * from product_component_version;
很明显,两个数据库版本确实是不一样,那怎么解决?
有两个方案:
-
如果是新建的Oracle数据库,那就删除掉,跟服务器A的数据库保持一致的版本。
-
那如果不想删除数据库,直接改dmp文件的oracle版本
ETX ETX TEXPORT
修改oracle版本:
3.5 可能会乱码。
编码不一样,就会导致乱码。这是很常见的事情。
其根本原因主要是数据编码不一致导致。根据其原理排查数据编码,基本都可以解决乱码问题。
解决方法:查看编码。
# 查看oracle数据库字符集:
select userenv('language') from dual;
# 查看oracle数据库的编码
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
后面我改了服务端的字符集为gbk就显示正常了。
alter database character set internal_use ZHS16GBK;
延伸情况
3.5.1 oracle和java
如果plsql查出来不会乱码,但通过java打断点查出来乱码,那可能是oracle数据库的编码不是utf-8,因为java默认是utf-8
3.5.2 oracle和系统环境变量
如果还是乱码的话,在看看本地的环境变量。
添加系统环境变量NLS_LANG,将其值与数据库编码设置保持一致,即上一步查询的查询结果SIMPLIFIED CHINESE_CHINA.ZHS16GBK。点击保存即可。
关闭当前的客户端查询工具,重新打开查看和验证是否已经恢复正常的中文编码。
后记
接触Oracle的时候,还是在上家前后端都做的日子。其实对于新人都接触对个人生涯我觉得是很有帮助的。
因为前后端都懂的话,有很多好处,就比如:有一个需求来了,可能这个前端做是可以实现的,但后端做,可能会更好(可能对于性能等等来说)
更能知道哪端做会更合适、更优 ~
如果对您有帮助,你的点赞是我前进的润滑剂。
相关文献
以往推荐
vue-typescript-admin-template后台管理系统