`
zhang_637
  • 浏览: 15120 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql下海量数据迁移(搬库)

    博客分类:
  • DB
阅读更多
    公司数据中心计划将海量数据做一次迁移,同时增加某时间字段(原来是datatime类型,现在增加一个date类型),单表数据量达到6亿多条记录,数据是基于时间(月)做的partition
    由于比较忙,一直没有总结,所以很细节的地方都记不清楚了,此处只是简单总结下当时的情形,备忘
    乱打乱撞
    最初接到任务,没有明确的入手点,直接就是select * from db limit 10000,动态修改翻页数量,通过控制台看耗时情况,慢
SELECT IR_SID,IR_HKEY,IR_GROUPNAME,IR_SITENAME,IR_CHANNEL,IR_MID,IR_URLNAME,IR_STATUS_CONTENT,IR_CREATED_AT,date_format(IR_CREATED_AT,'%Y.%m.%d'),IR_LASTTIME,IR_VIA,IR_THUMBNAIL_PIC,IR_RTTCOUNT,IR_COMMTCOUNT,IR_UID,IR_SCREEN_NAME,IR_RETWEETED_UID,IR_RETWEETED_SCREEN_NAME,IR_RETWEETED_MID,IR_RETWEETED_URL,IR_STATUS_BODY
FROM TB_SINA_STATUS
WHERE IR_SID>40000 AND IR_SID<50001
INTO OUTFILE '/home/mysql/data/data_outfile.txt';
LOAD DATA INFILE '/home/mysql/data/data_outfile.txt' INTO TABLE NEW_TB_SINA_STATUS;

    是否可以基于partition读数据呢
    既然数据库是按partition做分区,是否可以按partition读数据呢,如果可以改用怎样的语法读呢?时间上只要按月读数据,mysql会自动的基于partition读,具体可以用命令:explain partition即可看到具有基于哪个partition
    读大数据会十分耗时,对于数据进行到什么状态,我们可能十分想了解,可以用命令:show status查看,我印象中主要是sending data,writting to net之类的。
    innodb引擎的性能较myIsam引擎到底如何?
    导库实验中导出并导入一个月的数据(8G的文本量,2500w条记录),在myisam引擎下需要不到4h(测试环境为pc机),但是在innodb引擎下,却需要32小时,改善索引之类的,也需要28h,性能有8倍之差。
    在网上找到了高人关于innodb与myisam区别,说需要修改innodb_buffer_pool_size、innodb_flush_log_at_trx_commit
可保证没有太大差别,尝试了没有明显改善,在本机倒是可以,为什么呢???这个折腾了我好长时间
   
引用
innodb_flush_log_at_trx_commit
    是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置 为 0 就快很多了,不过也相对不安全了 — MySQL服务器崩溃时就会丢失一些事务。设置为 2 只会丢失刷新到操作系统缓存的那部分事务。

引用
innodb_buffer_pool_size
    Innodb在默认的 innodb_buffer_pool_size 设置下跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。

    最后千辛万苦的、跋山涉水的,找到了另外两个参数
引用
innodb_log_file_size
    在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。

引用
innodb_log_buffer_size
    默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。越小的系统它的值越小。

    最终搞定,myisam与innodb的导数据的性能基本一致,2500的数据约需要3.5h,单库读数据需要2h,这个只是一个示意值仅供参考(pc上的测试),正式服务的上的测试结果更加明显
    性能调优语句参考
   
    set profiling = 1;
    show profiles\G
    SHOW profile CPU,BLOCK IO io FOR query 1;
    show status
    Show Processlist
    explain

    并行读取是否会更快?
    如果基于partition导数据,还是不能达到既定目标,我最终是通过编写shell脚步,多进程并行基于partition导数据,即启动多个mysql -uroot -p db < exp201201.sql 、mysql -uroot -p db < exp201202.sql,每个sql下按天做读写(事件环境下是按月做partition的)
SELECT IR_SID,IR_HKEY,IR_GROUPNAME,IR_SITENAME,IR_CHANNEL,IR_MID,IR_URLNAME,IR_STATUS_CONTENT,IR_CREATED_AT,date_format(IR_CREATED_AT,'%Y.%m.%d'),IR_LASTTIME,IR_VIA,IR_THUMBNAIL_PIC,IR_RTTCOUNT,IR_COMMTCOUNT,IR_UID,IR_SCREEN_NAME,IR_RETWEETED_UID,IR_RETWEETED_SCREEN_NAME,IR_RETWEETED_MID,IR_RETWEETED_URL,IR_STATUS_BODY
INTO OUTFILE '/home/mysql/data/sinawb20120724/111101.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' 
LINES TERMINATED BY '\n'
FROM TB_SINA_STATUS 
WHERE ir_created_at >='2011-11-01 00:00:00' and ir_created_at <'2011-11-01 23:59:59'
;
LOAD DATA  LOCAL INFILE '/home/mysql/data/sinawb20120724/111101.txt' 
IGNORE INTO TABLE `NEW_TB_SINA_STATUS`
CHARACTER SET UTF8 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' 
LINES TERMINATED BY '\n'
;



  • 大小: 12.8 KB
分享到:
评论
1 楼 di1984HIT 2013-08-23  
记录一下。

相关推荐

    MySQL下海量数据的迁移步骤分享

    MySQL海量数据迁移是一项复杂且耗时的任务,尤其是当数据量达到6亿条记录时,传统的备份与恢复方法已经不再适用。因此,了解MySQL海量数据迁移的正确步骤和注意事项是至关重要的。 首先,我们来探讨一下MySQL的分区...

    MySQL海量数据查询优化策略.

    在处理MySQL海量数据查询优化时,我们需要关注的策略包括但不限于以下几点: 1. 优化索引使用:避免全表扫描至关重要。为此,应当在查询条件(WHERE)和排序(ORDER BY)涉及的列上创建索引。索引有助于数据库管理...

    基于AnalyticDB for MySQL构建实时数据仓库.pdf

    - **增量同步**: 通过数据迁移或跨库SQL等方式实现增量数据的同步。 #### 五、总结 通过以上介绍可以看出,利用AnalyticDB for MySQL构建实时数据仓库不仅可以提高数据处理的速度和效率,还能降低运维成本,增强...

    mysql中数据经处理导入到hbase中

    这个过程涉及了SQL查询、数据转换、数据预处理、JSON解析、HBase表设计以及客户端API的使用,是大数据领域常见的数据迁移任务。在实际操作中,可能还需要考虑到性能优化、错误处理和数据一致性等问题,以确保整个...

    mysql海量数据的存储和访问解决方案归类.pdf

    【MySQL海量数据存储与访问解决方案】 在当今互联网时代,随着大数据量的不断增长,如何高效地存储和访问这些数据成为了一个至关重要的问题。MySQL作为广泛应用的关系型数据库管理系统,面临着处理海量数据的挑战。...

    mysql海量数据的存储和访问解决方案借鉴.pdf

    总结来说,解决MySQL海量数据存储和访问的策略主要包括数据切分(水平切分)、负载均衡、读写分离等,通过这些技术可以有效应对大数据场景下的性能挑战,保证系统的稳定性和扩展性。在实际应用中,需要根据业务需求...

    mysql海量数据的存储和访问解决方案参考.pdf

    【MySQL海量数据存储与访问解决方案】 随着互联网的快速发展,数据量呈现爆炸式增长,如何有效存储和访问这些海量数据成为系统设计的关键挑战。对于大型互联网应用,如每天处理数十亿的页面浏览量(PV),数据库的...

    海量数据处理优化

    - **Oracle到MySQL的数据迁移**:采用异构读写分离的方法,将数据从Oracle逐步迁移到MySQL,以此来分散写操作的压力。 #### 七、应用层架构 - **应用层架构的重要性**:为了满足新一代网站架构的要求(如敏捷开发...

    Mysql海量数据存储和解决方案之-分布式DB方案.docx

    【标题】:MySQL海量数据存储与解决方案——分布式DB方案 【描述】:本方案探讨了在应对大规模互联网应用中遇到的数据库负载问题,主要关注的是MySQL的分布式数据库解决方案,包括数据切分、集群、负载均衡等技术,...

    mysql海量数据的存储和访问解决方案汇编.pdf

    【MySQL海量数据存储和访问解决方案】随着互联网的快速发展,数据量呈爆炸式增长,传统的单台数据库服务器已无法满足大规模应用的需求。此时,数据切分成为解决存储和访问瓶颈的关键技术。数据切分,即Sharding,是...

    mysql海量数据的存储和访问解决方案宣贯.pdf

    MySQL 海量数据的存储和访问解决方案宣贯 MySQL 海量数据的存储和访问解决方案宣贯是当前互联网应用中一个非常重要的课题。随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个...

    Python+MySQL分表分库实战

    分表分库,也称为数据库水平扩展,是应对海量数据的常用策略。当单个数据库表的数据量过大时,会导致查询效率降低,甚至影响系统的整体性能。通过将一个大表分成多个小表,或者将数据分散到多个数据库实例中,可以...

    hbase海量数据的全量导入方法

    ### HBase海量数据全量导入方法详解 在大数据领域,HBase作为一款分布式、版本化的宽列存储NoSQL数据库,以其高效的数据读取能力而著称。然而,在面对大规模数据导入时,其compaction机制可能会成为性能瓶颈。本文...

    一种MySQL到HBase的迁移策略的研究与实现

    随着Web2.0的到来,互联网数据快速增长。大规模数据的采集和处理及应用直接影响着用户体验,决定着...Web2.0时代,网络技术飞速发展,个人与企业都在不断地创造海量数据,在新的掘金大潮中,如何利用数据以及将数据转

    HCIP-GaussDB for MySQL题库.docx

    - 高兼容性:与MySQL保持高度兼容,使得迁移和使用更为便捷。 3. **华为云数据库配套工具**: - DAS(Database Administration Service):数据库运维管理服务,提供数据库监控、诊断、优化等功能。 - DRS(Data...

    hive.ziphive数据迁移和数据分析

    1. **数据源准备**:数据迁移的第一步是确定数据源,可能来自关系型数据库(如MySQL、Oracle等)、NoSQL存储(如HBase)或其他HDFS文件。Hive支持多种数据导入方式,如`LOAD DATA`命令、`INSERT OVERWRITE`语句、`...

    海量数据库解决方案

    在当前的信息化时代,随着大数据的快速发展,处理海量数据已成为许多企业和机构面临的重大挑战。"海量数据库解决方案"这个主题正是针对这一问题展开的讨论。在这个领域,我们需要关注以下几个关键知识点: 1. 数据...

Global site tag (gtag.js) - Google Analytics