项目过程中遇到云服务器切换的问题,因为之前的服务器资源被其他服务占用过多,因此需要将项目中用到的相关组件全部迁移到另一台新的服务器中,这中间遇到了很多问题,首先数据库迁移就是第一个遇到的问题,不仅是新的Oracle数据库安装,还需要将老数据库中的所有数据包括存储过程、索引、包等全部转存到新数据库。
Oracle数据库安装其实能够搜索出很多教程,但我这次推荐百度经验的一篇,我实际按流程操作过一遍的,当然其中也会遇到一定的问题,具体地址:https://jingyan.baidu.com/article/90895e0f29c92164ec6b0bd1.html
按照完整的步骤安装,我只遇到了一个问题,在这篇经验中没有提到,但我另外去搜索很快就找到了解决方案,地址如下:https://blog.csdn.net/Heyyouare/article/details/88975629
1 | Exception in thread “main” java.lang.UnsatisfiedLinkError: /u01/app/oracle/product/11.2.0/db_1/jdk/jre/lib/amd64/xawt/libmawt.so: libXext.so.6: wrong ELF class: ELFCLASS32 |
Oracle数据库数据导出以及备份
数据导出和导入
安装过程只是其中的一部分,紧接着就是数据的导出和导入,首先一个问题就是要保持数据库导出方的字符集和导入方的字符集保持一致,要确保两台服务器的字符集要一致,否则很容易发生导入数据乱码的问题,这个问题是我亲身经历的,在服务器.bash_profile中配置如下:
1 | export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" |
能够使用的导出和导入方法一般有两种,一种是通过Oracle连接工具操作,这种操作的问题是速度非常慢,并且很容易发生导出或导入到一半就发生客户端崩溃的问题;另一种是使用Oracle自带的命令,在这边我自己通过查询文章后总结了一下,因为导入导出命令Oracle也进行了更新,使用老的导入导出命令会产生一定的问题,使用新的命令更稳定。
步骤一:在导出数据库中创建导出的dmp文件的目录,这个目录必须指定,否则导出命令无法执行,该命令需要使用sqlplus进入Oracle的命令窗口:
1 | create or replace directory dumpdir as '/home/oracle'; |
步骤二:在oracle用户下执行导出命令:
1 | expdp 用户名/密码@orcl11g dumpfile=backup.dmp directory=dumpdir |
步骤三:将导出的dmp文件拷贝到新的数据库服务器上,这边方式有多种,可以通过FTP工具下载到本地,也可以使用scp命令远程传送,这边我介绍scp命令:
1 | scp -r backup.dmp oracle@服务器地址:/home/oracle/ |
步骤四:在新的数据库中建立和旧的服务器相同的文件夹:
1 | create or replace directory dumpdir as '/home/oracle'; |
步骤五:执行导入命令,同样是在oracle用户下执行,如果执行过程中出现中断的问题,需要进入数据库删除该用户重新执行命令:
1 | impdp 用户名/密码@orcl dumpfile=backup.dmp directory=dumpdir schemas=OPERQRY |
采用定时任务的方式对数据库进行备份
上面的导入和导出命令执行成功后,结合项目实际开发中遇到的数据误删的问题,我们决定编写一个自定义shell脚本对数据库进行每日备份,由于数据库的数据每日都在进行更新,因此我们采用每日备份的机制,且数据量会越来越大,我们还需要保留近期数据,将旧数据进行删除,下面我将备份脚本列出,以供参考:
1 | !/bin/bash |
脚本编写完成后,我们使用Linux的定时任务进行执行:
1 | 0 1 * * * . ~/.bash_profile; /bin/sh /home/oracle/backup.sh |
上面的. ~/.bash_profile;的配置需要说明一下,不加这段描述的时候我的定时任务始终执行失败,这是由于expdp和impdp是Oracle提供的,因此我们需要在.bash_profile中配置Oracle的信息,来执行这个命令,配置如下:
1 | ORACLE_BASE=/u01/app/oracle |