end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

mysqlでbulk insert

mysqlで大量のデータをまとめて登録する場合、LOAD DATAコマンドを使用して、次のように実行できます。

#!/usr/local/bin/perl
use strict;
use DBI;
use Data::Dumper;

my $CONF_DB =
    {host =>    "localhost",
     port=>     "3306",
     db_name=>  "test",
     db_user=>  "test_user",
     db_pass=>  "ないしょ",
     db_opt=>{AutoCommit=>0,
	      RaiseError=>1,
	      mysql_enable_utf8=>1,
	      on_connect_do => ["SET NAMES 'utf8'",
				"SET CHARACTER SET 'utf8'"] }
    };

main(@ARGV);

sub main {
    my ($table_name,$file_path) = @_;

    my $dbh = connect_db();

    my $sql =<<EOF;
LOAD DATA INFILE '$file_path'
INTO TABLE $table_name
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
EOF
    my $sth = $dbh->prepare($sql);
    unless ($sth->execute()){
	die $sth->errstr;
    }

    $dbh->commit();
    $dbh->disconnect();
}

sub connect_db {
    my $db =
        "DBI:mysql:database=$CONF_DB->{db_name};host=$CONF_DB->{host}";
    my $dbh = DBI->connect($db,
                           $CONF_DB->{db_user},
                           $CONF_DB->{db_pass},
                           $CONF_DB->{db_opt}); #DB option設定
    return $dbh;
}

「GRANT FILE ON *.* TO user_name@localhost;」が必要だったような...

先程のperl scriptは、mysql ver.5.1.46では問題なく実行できました。
ただ、ver.5.1.41辺りで同様のscriptを実行した際、次のようなエラーで怒られたので、わざわざ GRANT FILE ON *.* TO user_name@localhost; を行った記憶がありますが、なぜ今回は、問題なく実行できたんだろう...

DBD::mysql::st execute failed:
The used command is not allowed with this MySQL version at ...