Oracle--数据迁移

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_41089021/article/details/84639601

 需求:将一个数据库下的几张表迁到一个新库

        在最初的设计中,一些轻量级的业务(群聊)数据和用户的基本信息是在同一个库中的,在今年年初,随着用户量突破8千万,这些业务操作对数据库的压力越来越大,需要将其从用户信息库(USERDB)中分离出来单独建立一个数据库(GROUPDB)处理,以减轻用户信息库的压力。

分析:

  1. 该业务数据包含群数据、群成员数据、群聊数据,共计150张表,2亿7839万条记录,数据文件大小31.5G
  2. 两个库不在同一台数据库服务器上,在GROUPDB所在服务器上实测从USERDB所在服务器上ftp get速度在100MB/s以上
  3. 可以接受停机操作,但窗口时间不能超过40分钟,也就是说实际生产上需要在40分钟内执行完毕

操作:
1.新建数据库

根据数据库安装手册安装oracle数据库,将实例配置为GROUPDB,然后规划表空间和索引空间,如下:

set echo on
spool CreateDB.log
--创建索引空间 ...
create tablespace index datafile '/GROUP/index01' size 10240M reuse,
'/GROUP/index02' size 10240M reuse
... ...
extent management local segment space management auto
/
--创建表空间 ...
create tablespace tablelog datafile '/GROUP/tablelog01' size 20480M reuse ,
'/GROUPDB/tablelog02' size 20480M reuse
... ...
extent management local segment space management auto
/
spool off;

创建表空间和索引空间时,需要根据历史数据增长速度和当前数据文件大小来规划需要开辟的空间大小。

创建完表空间后,需要添加数据库用户并授予相应权限,这个权限要与USERDB里的用户权限保持一致。
数据导出

先在要导出的数据库上创建一个文件夹(如:/home/userData),用于存储导出的数据文件,然后在数据库上执行创建目录的脚本,将数据库操作目录指向创建的文件夹

create or replace directory TRANS_USER as '/home/userData';

2.使用数据泵导出数据:

#!/bin/ksh
ORACLE_SID=USERDB;export ORACLE_SID
#STEP1 后台执行脚本
nohup expdp USER/USER directory=TRANS_USER
content=data_only tables=GROUP query=GROUP:\"where MODgroupid,50\<25\"
dumpfile='GROUP1.dmp' cluster=no logfile='exp_trans1.log' &
Sleep 5
... ...
#STEP2 统计脚本执行情况
while [ 1 -eq 1 ]
do
        lineNum=`find ./ -name "*.log" | xargs grep "exported" | wc -l`
        echo $lineNum
        if [ $lineNum -eq 150 ]
        then
               echo 'Data exported success!!!'
                break
        else
                echo 'Data exported continue ...'
                sleep 5
        fi
done

 

STRP1:由于数据量比较大,建议用nohup ... &的方式在后台执行脚本

在执行expdp时,可以使用query参数进行数据筛选,如:

query=GROUP:\"where MODgroupid,50\<25\" 

是顺道将GROUP表按照groupId字段取余进行一次拆表。

STEP2:因为都是在后台执行的数据泵导出脚本,多个脚本并行执行,加快了导出速度,但是不好统计。在这里统计导出日志里的关键字(exported)来判断有多少脚本执行完毕:

lineNum=`find ./ -name "*.log" | xargs grep "exported" | wc -l`

 
3.数据导入

先在要导入的数据库上创建一个文件夹(如:/home/userData),用于存储导出的数据文件,然后在数据库上执行创建目录的脚本,将数据库操作目录指向创建的文件夹:

扫描二维码关注公众号,回复: 4539288 查看本文章
create or replace directory TRANS_GROUP as '/home/userData';

再使用ftp get命令将要导入的.dmp文件传到新建的文件夹,记得切换本地目录:

get /home/userData/*.dmp

然后进行数据导入:

#!/bin/ksh
ORACLE_SID=GRPDB;export ORACLE_SID
#STEP1 导入时注意切换schema
nohup impdp group/group directory=TRANS_GROUP remap_table='GROUP:GROUP_1' dumpfile='GROUP1.dmp'
table_exists_action=append  cluster=no logfile='GROUP1.log' content=data_only remap_schema=user:group &
... ...
sleep 2
done
while [ 1 -eq 1 ]
do
        lineNum=`find ./ -name "*.log" | xargs grep "imported" | wc -l`
        echo $lineNum
        if [ $lineNum -eq 150 ]
        then
               echo 'Data imported success!!!'
                break
        else
                echo 'Data imported continue ...'
                sleep 5
        fi
done

STEP1:用于导入导出的库不同,在导入数据时,需要切换schema(remap_schema=user:group)

4.数据验证

当数据全部迁移完毕后,建议做一下数据验证,以确保导入导出后的数据完全一致,可以采用总量验证和抽样验证相结合的方法。

数据验证完毕后要检查下原数据表相对应的一些sequence、job等是否需要同步

猜你喜欢

转载自blog.csdn.net/qq_41089021/article/details/84639601