五分钟,请将服务器A的数据库迁移到B中 | 实战篇

653 阅读5分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

前言

  • 在线音乐戳我呀!
  • 音乐博客源码上线啦!
  • 前几篇讲了Docker的安装部署,操作算说比较简单的。
  • 接下来将分享如何将服务器A的数据库迁移(导入)到服务器B的数据库中,一五一十盘出。
  • Are you ready ?

上个星期去了韶关云门寺拜香。烟雾缭绕仿佛想起在仙界的日子。怀念呀~

1.jpg

将服务器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上。

2.png

3.4 可能会导入失败。

如果运气好,那就没这一步了,但如果导入失败的朋友,请继续往下看。

导入失败的其中一个原因:版本问题。

查看数据库版本是多少:

select * from product_component_version;

3.png

很明显,两个数据库版本确实是不一样,那怎么解决?

有两个方案:

  • 如果是新建的Oracle数据库,那就删除掉,跟服务器A的数据库保持一致的版本。

  • 那如果不想删除数据库,直接改dmp文件的oracle版本ETX ETX TEXPORT

修改oracle版本:

4.png

3.5 可能会乱码。

编码不一样,就会导致乱码。这是很常见的事情。

其根本原因主要是数据编码不一致导致。根据其原理排查数据编码,基本都可以解决乱码问题。

5.png

解决方法:查看编码。

# 查看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。点击保存即可。

6.png

关闭当前的客户端查询工具,重新打开查看和验证是否已经恢复正常的中文编码。

后记

接触Oracle的时候,还是在上家前后端都做的日子。其实对于新人都接触对个人生涯我觉得是很有帮助的。

因为前后端都懂的话,有很多好处,就比如:有一个需求来了,可能这个前端做是可以实现的,但后端做,可能会更好(可能对于性能等等来说)

更能知道哪端做会更合适、更优 ~

如果对您有帮助,你的点赞是我前进的润滑剂。

相关文献

DOCKER - ORACLE数据库命令行创建表空间及用户

查看及修改Oracle编码格式方法

Oracle数据库数据显示乱码问题解决方法

以往推荐

尤大大说我的代码全部不加分号

老湿说的万物皆对象,你也信?

Vue-Cli3搭建组件库

Vue实现动态路由(和面试官吹项目亮点)

项目中你不知道的Axios骚操作(手写核心原理、兼容性)

VuePress搭建项目组件文档

koa2+vue+nginx部署

vue-typescript-admin-template后台管理系统

原文链接

juejin.cn/post/703097…