最近接到了大量的需求,需要每天定时的从oracle导到Mysql生产服务器上,数据量还比较大,大概在5亿,90G左右,数据量太大了,需要进行分表,小表跑的快,失败的几率也小一些。
1.分表,单个表数据量控制在5G(个人随意指定)
2.找一台中转服务器,需要安装oracle和mysql的客户端,这台服务器需要从源oracle数据库上导出数据,然后导到目标mysql服务器中
3.通过sqluldr
从源oracle把数据导出来,导成txt文件
mytest:/bak1/tmp_dy>$sqluldr2 user='test/test@oradb' query='select * from dm_mining_wm_0002' text=mysql file=/test/tmp_dy/dm_mining_wm_0002.txt
0 rows exported at 2010-06-03 14:03:17, size 0 MB.
1000000 rows exported at 2010-06-03 14:03:28, size 108 MB.
2000000 rows exported at 2010-06-03 14:03:39, size 216 MB.
3000000 rows exported at 2010-06-03 14:03:51, size 328 MB.
4000000 rows exported at 2010-06-03 14:04:05, size 436 MB.
。。。。。
24000000 rows exported at 2010-06-03 14:08:23, size 2632 MB.
25000000 rows exported at 2010-06-03 14:08:39, size 2740 MB.
26000000 rows exported at 2010-06-03 14:08:50, size 2852 MB.
27000000 rows exported at 2010-06-03 14:09:00, size 2960 MB.
28000000 rows exported at 2010-06-03 14:09:16, size 3068 MB.
28152179 rows exported at 2010-06-03 14:09:17, size 3088 MB.
output file /test/tmp_dy/dm_mining_wm_0002.txt closed at 28152179 rows, size 3088 MB.
test86:/bak1/tmp_dy>$
4.检查参数目标mysql服务器上的max_binlog_cache_size,需要设置的比生成文件要大,这边设置5G。
$mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1542050
Server version: 5.1.45-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
root@(none) 02:13:30>show variables like '%binlog%';
+-----------------------------------------+------------+
| Variable_name | Value |
+-----------------------------------------+------------+
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| innodb_locks_unsafe_for_binlog | OFF |
| max_binlog_cache_size | 5368709120 |
| max_binlog_size | 524288000 |
| sync_binlog | 0 |
+-----------------------------------------+------------+
7 rows in set (0.00 sec)
--相关参数说明
Binlog_cache_use状态变量显示了使用该缓冲区(也可能是临时文件)保存语句的事务的数量。
Binlog_cache_disk_use状态变量显示了这些事务中实际上有多少必须使用临时文件。这两个变量可以用于将binlog_cache_size调节到足够大的值,以避免使用临时文件。
max_binlog_cache_size(默认4GB)可以用来限制用来缓存多语句事务的缓冲区总大小。如果某个事务大于该值,将会失败并 回滚。
5.通过load data远程导到目标mysql服务器上。
/bak1/tmp_dy>$mysql -h 192.168.0.1 -P 3306 -u mytest -pmytest --local-infile=1
--远程导入需要加上的参数
01:41:48>LOAD DATA LOCAL
INFILE '/test/tmp_dy/dm_mining_wm_0002.txt'
-> ignore INTO TABLE mytest.user_bought_shops_0002
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Query OK, 28173117 rows affected, 749 warnings (8 min 17.01 sec)
Records: 28173117 Deleted: 0 Skipped: 0 Warnings: 748
6.查看目标mysql服务器文件大小
$ls -lht user_bought_shops_0002.ibd
-rw-rw---- 1 mysql dba 4.5G Jun 3 14:21 user_bought_shops_0002.ibd --数据和索引,4.5G左右
约3000万记录数,约3000M的文件,单个进程远程导到mysql服务器需要8分钟,还算凑合。
简单测试过,直接远程客户端导到mysql服务器上,和先把文件copy到mysql服务器上,本地做导入的效率相差不大,看来瓶颈不在于网络上,注:仅仅记录测试结果,效率和mysql硬件环境,特别是IO效率有很大关系,不存在太多的数据参考价值。
mysql环境:5.1.45版本,innodb 引擎。
转于: http://xujt82.spaces.live.com/blog/cns!1EB2C64171792704!611.entry