時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

CentOSへのMySQL導入とperlからの実行

こんにちは続けてMySQLを導入してperlから実行できるようにしたいと思います。

データベースはユーザーデータの管理や、商品の管理な様々な用途に使えます。

はじめに

今回はrpmMySQLパッケージをインストールして、まずはコマンドから実行しDatabaseとTableを作成したいと思います。その後、PerlからDBIを通じてデータベースをいじってみたいと思います。

  • MySQLのインストール
  • (tips)InnoDBに関するエラー対策
  • データベースとテーブルの作成(コマンド)
  • データの閲覧(perl)
  • (tips)DBパスワードに関する注意

MySQLのインストール

以下のサイトを参考にしました。
qiita.com

まずはじめに、既存にMySQLがインストールされているかを確認します。

yum list installed | grep mysql

入っていれば消してください。

yum erase mysql-libs

次にMySQLrpmパッケージをインストールします。

wget http://downloads.mysql.com/archives/get/file/MySQL-client-5.6.20-1.linux_glibc2.5.x86_64.rpm
wget http://downloads.mysql.com/archives/get/file/MySQL-server-5.6.20-1.linux_glibc2.5.x86_64.rpm
wget http://downloads.mysql.com/archives/get/file/MySQL-shared-compat-5.6.20-1.linux_glibc2.5.x86_64.rpm
wget http://downloads.mysql.com/archives/get/file/MySQL-devel-5.6.20-1.linux_glibc2.5.x86_64.rpm
yum install MySQL-client-5.6.20-1.linux_glibc2.5.x86_64.rpm
yum install MySQL-server-5.6.20-1.linux_glibc2.5.x86_64.rpm
yum install MySQL-shared-compat-5.6.20-1.linux_glibc2.5.x86_64.rpm
yum install MySQL-devel-5.6.20-1.linux_glibc2.5.x86_64.rpm

インストールが確認できたら起動します。

service mysql start

次に初期化を行うのですが、パスワードが必要になります。パスワードは以下で確認してください。

view /root/.mysql_secret

それでは、初期化を行います。

mysql_secure_installation

実行すると初めに現在のパスワードを聞いてきます。次に新しいパスワードを設定するか、などいくらか質問が来るので答えてください。

これでインストールと初期化が完成です。

MySQLのログインは以下のコマンドで行います。

mysql -u root -p

実行するとSQLを打てるモードになります。抜ける時は

\q

で抜けてください。

(tips)InnoDBに関するエラー対策

もしかすると、初期化の際に以下のようなエラーが出てしまうかもしれません。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

これは何らかの原因でmysql start した時にsockが生成されなかったためです。
僕の場合は/var/lib/mysql/user.errに以下のようなErrorが出ていました。

[ERROR] InnoDB: Unable to lock ./ibdata1, error: 11

理由はmysqlがもう裏で起動していたためです。プロセスをキルして、再起動することで解決しました。
以下に参考にしたURLを貼っておきます。

MySQLが起動できない | 猫型iPS細胞研究所

データベースとテーブルの作成(コマンド)

それでは用意ができたところで、DBとtableをコマンドで作成します。
参考にしたサイトは以下のサイトです。

Perl/DBIを使ってMySQLでSELECT文を実行する - 調べる.DB

MySQLでログインしたあと、以下のコマンドを入力します。

mysql> create database db;
mysql> use db;
mysql> create table t1 (a int, b varchar(10));
mysql> insert into t1 values(1,'aaaa'),(2,'bbbb'),(3,'cccc');
mysql> select * from t1;
mysql> \q

実行結果は以下のようになります。

+------+------+
| a    | b    |
+------+------+
|    1 | aaaa |
|    2 | bbbb |
|    3 | cccc |
+------+------+
3 rows in set (0.00 sec)

データの閲覧(perl)

それではいま作成したデータをperlで表示したいと思います。

ですがその前にperlからMySQLを操作するDBIとDBDをインストールします。
DBIはData Base Interface
DBDはData Base Driver
です。以下のコマンドで行います。

yum -y install perl-DBI perl-DBD-MySQL

それでは、実際に表示を行うperlのコードをいかに示します。

test.pl

#!/usr/bin/perl

use strict;
use DBI;

our $DB_NAME = "db";
our $DB_USER = "root";
our $DB_PASS = "自分の指定したパスワード";
our $DB_HOST = "localhost";
our $DB_PORT = "3306";

my $dbh = DBI->connect(
    "dbi:mysql:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT",
    "$DB_USER",
    "$DB_PASS")  or die "$!\n Error: failed to connect to DB.\n";

my $sth = $dbh->prepare("SELECT * FROM t1;");
$sth->execute();

while (my $ary_ref = $sth->fetchrow_arrayref) 
{
  my ($a, $b) = @$ary_ref;
  print "$a, $b\n";
}

$sth->finish;
$dbh->disconnect;

参考サイトとほぼ同じですが。。。

実行は以下のコマンドで行います。

perl test.pl

以上で終了となりましす。

(tips)DBパスワードに関する注意

パスワードを設定するときの注意点なのですが、@などの文字をパスワードに含める時は以下のように\をしっかりつけてください。
僕はコレのせいでなんでデータベースにつながらないのかをかなりまよいました。

our $DB_PASS = "nantoka\@nantoka";

終わりに

終わってみるとあっという間ですが、perlソースを実行するのに二時間くらいかかってしまいました。これを経て学んだことは

  • エラーログをしっかり見る
  • わからない時は基本的なことを確認する

です。皆さんも参考にしてください。