使用perl实现拆分数据表(mysql)并迁移数据实例

随着业务量的增长,可能需要对表进行拆分来提高性能。

下面这个例子是将www.jb51.net的users表拆分成10个表ttlsa_user_0-ttlsa_user_9。

拆分迁移数据程序如下所示:

1.创建ttlsa_user_0-ttlsa_user_9表

代码如下:

#!/usr/bin/perl
###################################
### author: www.jb51.net ###
### QQ群:232608061  ###
### E-mail:service@jb51.net ###
###################################

use DBI;

my $driver=”DBI:mysql”;
my $from_database=”ttlsa”;
my $from_user=”root”;
my $from_password=”123456″;
my $from_host=”localhost”;

$from_dbh=DBI->connect (“$driver:$from_database:$from_host;user=$from_user;password=$from_password”) or die “cannot connect: “. DBI->errstr;

for (0..9) {
$sql=”CREATE TABLE `ttlsa_user_$_` (
`uid` int(10) NOT NULL AUTO_INCREMENT,
`email` varchar(50) NOT NULL,
`passwd` varchar(40) NOT NULL,
`user_name` varchar(20) NOT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT”;
$from_dbh->do($sql);
}
$from_dbh->disconnect();

2.迁移数据

代码如下:

#!/usr/bin/perl
###################################
### author: www.jb51.net ###
### QQ群:232608061  ###
### E-mail:service@jb51.net ###
###################################

use DBI;

my $driver=”DBI:mysql”;
my $from_database=”ttlsa”;
my $from_user=”root”;
my $from_password=”123456″;
my $from_host=”localhost”;

$from_dbh=DBI->connect (“$driver:$from_database:$from_host;user=$from_user;password=$from_password”) or die “cannot connect: “. DBI->errstr;
$from_dbh->do(“set names ‘utf8′”);
$from_dbh->do(“set session autocommit=0″);
$from_dbh->do(“set session unique_checks=0″);

$max=600000;
$step=10000;
for ($i=1;$i $step_i=$i+$step;
$sql=”select * from ttlsa_users where user_id>=$i and user_id $sth=$from_dbh->prepare($sql);
$sth->execute;
@value=();
while ($row=$sth->fetchrow_hashref()) {
$uid=$row->{uid};
$email=$row->{email};
$passwd=$row->{passwd};
$user_name=$row->{user_name};
$key=substr($user_id,-1);
$value[$key].=”(‘$uid','$email','$passwd','$user_name'),”;

}
for (0..9) {
chop($value[$_]);
$sql=”insert into ttlsa_user_$_ (`uid`,`email`,`passwd`,`user_name`) values” . $value[$_];
$from_dbh->do(“$sql”);
}
}
$from_dbh->do(“set session autocommit=1″);
$from_dbh->do(“set session unique_checks=1″);
$sth->finish();
$from_dbh->disconnect();

3.附录

如果没有那么多数据量,可以随意插入一些数据进行测试。下面提供一个插入数据的脚本。

代码如下:

#!/usr/bin/perl
###################################
### author: www.jb51.net ###
### QQ群:232608061  ###
### E-mail:service@jb51.net ###
###################################

use DBI;
use Digest::SHA qw(sha1_hex);

my $driver=”DBI:mysql”;
my $from_database=”ttlsa”;
my $from_user=”root”;
my $from_password=”123456″;
my $from_host=”localhost”;

$from_dbh=DBI->connect (“$driver:$from_database:$from_host;user=$from_user;password=$from_password”) or die “cannot connect: “. DBI->errstr;
$from_dbh->do(“set names ‘utf8′”);
$from_dbh->do(“set session autocommit=0″);
$from_dbh->do(“set session unique_checks=0″);

for (1..100000) {
$insert_sql=$from_dbh->prepare(“insert into ttlsa_users (email,passwd,user_name) values (?,?,?)”);
$email=”auto-gre-$_\@jb51.net”;
$data=”auto-gre-$_”;
$passwd=sha1_hex($data);
$user_name=”auto-gre-$_”;
$insert_sql->execute($email,$passwd,$user_name);
}

$from_dbh->do(“set session autocommit=1″);
$from_dbh->do(“set session unique_checks=1″);
$insert_sql->finish();
$from_dbh->disconnect();

(0)

相关推荐

  • mysql 备份与迁移 数据同步方法

    不过最近发现这个可视化操作有点点问题,就是当数据条数超过一定数目EMS SQL Manager就挂了,也不知道是否是软件问题--当然该开始我是将大的数据库文件分拆成小份小份的,多次导入. 刚才发现同事用了mysql 自带的mysqldump 工具就不存在这个问题. (羞愧,不过我平时极少接触数据库) 这里记录下操作方式: 1. 进入bin目录,执行命令: mysqldump -hlocalhost -uroot -padmin local_db > a.sql 2. 这时发现在bin目录生成了

  • Perl访问MSSQL并迁移到MySQL数据库脚本实例

    Linux下没有专门为MSSQL设计的访问库,不过介于MSSQL本是从sybase派生出来的,因此用来访问Sybase的库自然也能访问MSSQL,FreeTDS就是这么一个实现.Perl中通常使用DBI来访问数据库,因此在系统安装了FreeTDS之后,可以使用DBI来通过FreeTDS来访问MSSQL数据库,例子: 复制代码 代码如下: using DBI;my $cs = "DRIVER={FreeTDS};SERVER=主机;PORT=1433;DATABASE=数据库;UID=sa;PWD

  • mysql中用于数据迁移存储过程分享

    复制代码 代码如下: DELIMITER $$ USE `servant_591up`$$ DROP PROCEDURE IF EXISTS `sp_move_data`$$ CREATE PROCEDURE `sp_move_data`() BEGIN DECLARE v_exit INT DEFAULT 0; DECLARE v_spid BIGINT; DECLARE v_id BIGINT; DECLARE i INT DEFAULT 0; DECLARE c_table INT; DE

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

    公司数据中心计划将海量数据做一次迁移,同时增加某时间字段(原来是datatime类型,现在增加一个date类型),单表数据量达到6亿多条记录,数据是基于时间(月)做的partition由于比较忙,一直没有总结,所以很细节的地方都记不清楚了,此处只是简单总结下当时的情形,备忘 乱打乱撞 最初接到任务,没有明确的入手点,直接就是select * from db limit 10000,动态修改翻页数量,通过控制台看耗时情况,慢 复制代码 代码如下: SELECT IR_SID,IR_HKEY,IR_

  • MySQL 数据库跨操作系统的最快迁移方法

    数据库文件很大,约有70G, 如果普通的迁移,需要在原始数据库导出数据,然后在新数据库导入数据 经仔细考虑,是否MySQL的数据库文件存储格式在不同的操作系统相同呢? 测试过程如下: 在64位SUN机器上安装64位版的MySQL 停止MySQL服务 复制Windows上的32位MySQL的数据文件(全部,除了system和日志等)到64位机器上, 修改相应的文件和目录权限, 文件为 chmod 660 目录为 chmod 700 然后重启MySQL服务,运行正常. 总结: 别以为这个看上去很简单

  • 关于MySQL数据迁移--data目录直接替换注意事项的详解

    近日更换服务器,要做数据库迁移,将数据库内的数据从服务器A迁移到服务器B.由于数据量较大,直接做dump耗时太长,故而采用如下方式处理:首先,在服务器B上安装了与服务器A同版本的MySQL,停止MySQL服务,将安装后的data目录删除:然后,服务器A锁住全部表,从服务器A将整个data目录和数据文件直到拷贝到服务器B上,修改服务器B上MySQL的my.cnf文件中的datadir指向新的data目录.最后,启动服务器B上的MySQL服务.结果启动失败,报出 "无法启动MySQL服务"

  • MySQL数据库迁移data文件夹位置详细步骤

    由于yum安装mysql的时候,数据库的data目录默认是在/var/lib下,出于数据安全性的考虑需要把它挪到/data分区.步骤如下:一.关闭apache和mysql. 复制代码 代码如下: service httpd stopservice mysqld stop 二.将/var/lib下的mysql目录mv(移动)到data目录.为什么要用mv命令,而不用cp命令呢?应为linux文件系统特殊性,mv命令能保留文件的所有属性和权限,尤其是selinux属性.如果用cp命令,就需要回头再去

  • 简述MySQL分片中快速数据迁移

    推荐阅读:MySQL 数据库跨操作系统的最快迁移方法 mysql 备份与迁移 数据同步方法 操作实践背景: travelrecord表定义为10个分片,尝试将10个分片中的2个分片转移到第二台MySQL上,并完成记录, 要求最快的数据迁移做法,中断业务时间最短 思路一利用mysqldump: 在这里我们只针对mysql innodb engine,而且配置bin-log的数据库进行分析.因为是将10个分片中的两个分片进行迁移,其实就是数据库的迁移过程,就是将10个数据库中的两个数据迁移到另外一台

  • mysql如何删除数据表和关联的数据表删除详情

    目录 前言 一.mysql删除没有被关联的表 二.删除被其他表关联的主表 前言 删除数据表的时候,表的定义和表中所有的数据均会被删除.因此,在进行删除操作前,最好对表中的数据做一个备份,以免造成无法挽回的后果. mysql删除数据表分为两种情况: mysql删除没有关联的表: mysql删除被关联的表: 下面我们就分别来看一下这两种情况: 一.mysql删除没有被关联的表 语法: drop table [if exists] 表1, 表2,...,表n: 可以同时删除多个表,只需要将删除的表名依

  • MSSql简单查询出数据表中所有重复数据的方法

    本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

  • MySQL创建和删除数据表的命令及语法详解

    创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (column_name column_type); 以下例子中我们将在 TUTORIALS 数据库中创建数据表tutorials_tbl: tutorials_tbl( tutorial_id INT NOT NULL AUTO_INCREMENT, tutorial_title VARCHAR(100) NOT N

  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库.使用以下方法,可以非常简单地实现. 假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb.步骤如下: 1. 首先创建新的数据库newdb #mysql -u root -ppassword mysql>CREATE DATABASE `newdb` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI; 2. 使用mysqldump及mysql的

  • MySQL之终端Terminal(dos界面)管理数据库、数据表、数据的基本操作

    MySQL有很多的可视化管理工具,比如"mysql-workbench"和"sequel-pro-". 现在我写MySQL的终端命令操作的文章,是想强化一下自己对于MySQL的理解,总会比使用图形化的理解透彻,因为我本来就比较喜欢写代码.同时写出来这些文章,是想要给大家当个参考,希望也能对大家有所帮助,有所提升,这就是我为什么要写终端操作MySQL的文章了. 注意:MySQL数据库命令不区分大小写.但在MAC的终端,如果你想使用tab自动补全命令,那么你就必须使用大

  • Mysql提升大数据表拷贝效率的解决方案

    前言 本文主要给大家介绍了关于Mysql提升大数据表拷贝效率的相关内容,分享出来供大家参考学习,我们大家在工作上会经常遇到量级比较大的数据表  : 场景: 该数据表需要进行alter操作 比如增加一个字段,减少一个字段. 这个在一个几万级别数据量的数据表可以直接进行alter表操作,但是要在一个接近1000W的数据表进行操作,不是一件容易的事: 可能情况: 1.导致数据库崩溃或者卡死 2.导致其他进程 进行数据库读写I/O变慢 3.还有一个可能就是数据格式不一致 导致数据无法写入(比如一个var

  • MySQL数据表基本操作实例详解

    本文实例讲述了MySQL数据表基本操作.分享给大家供大家参考,具体如下: 数据表的基本操作 1.主键约束要求主键列的数据唯一,并且不允许为空.主键能够唯一地识别表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度.主键和记录之间的关系如同身份证和人之间的关系. 2.字表的外键必须关联父表的主键,且关联字段的数据类型必须匹配.如果类型不一样.创建子表时,就会出现错误:ERROR 1005(HY000):can't create table 'databases.ta

  • MySQL数据库之数据表操作DDL数据定义语言

    目录 一.创建数据表 二.查询数据表 三. 删除数据表 四.修改数据表以及字段 一.创建数据表 数据表:一个二维的表格,一个表格是由多列组成,表格中的每一类称之为表格的字段 以上述学生信息表格为例在MySQL数据库中创建一张表格,语句如下(注:创建前应选择相应的数据库): create table students( stu_num char(8) not null unique, stu_name varchar(20) not null, stu_gender char(2) not nul

  • MySQL创建数据库和创建数据表的操作过程

    目录 MySQL 创建数据库和创建数据表 一.数据库操作语言 二.创建数据库 1. 连接 MySQL 2. 查看当前的数据库 3. 创建数据库 4. 创建数据库时设置字符编码 5. 查看和显示数据库的编码方式 6. 使用 alter database 数据库名 character set utf8: 修改数据库编码 7. 进入或切换数据库 8. 显示当前数据库 select database(); 三.创建数据表 1. 查看当前数据库中的表 2. 创建表 3. 显示表信息 4. 给表增加字段 5

  • MySQL创建数据库和创建数据表

    目录 MySQL 创建数据库和创建数据表 一.数据库操作语言 二.创建数据库 三.创建数据表 四.MySQL 常用字段类型 MySQL 创建数据库和创建数据表 MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD. 在这之前,需要先安装好 MySQL ,然后创建好数据库.数据表.操作用户. 一.数据库操作语言 数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言. SQL 的主要

随机推荐