postgreSQLからmysqlへの移行で気を付けたい点

postgreSQLからmysqlへの移行で気を付けたい点

postgresqlで、ある小さなシステムを構築準備してました。
現状あるシステムをそちらに載せ変えるという事で、
既存のデータをそのまま使いたい。

最初に確認しておけばすんだ事だけど、postgresのDBエンコードがEUCで、
変更できない事がデータの移行テストの段階でわかった。
新規DB作成も許可されていなかった。

元のシステムがUTF8なので、機種依存丸付き文字がばんばん使われている。
それをそのまま使えるようにしたいし、新しい入れ物はUTF8でないといけない。

mysqlなら新規DBも作成できるし、そもそもUTF8だったので、
急遽つくりかえることにした。

その際、種々の問題が発生したので覚え書きを残しておく。

■データ型
timestump型はdatetime型にする。
(複数カラムあるため)

■php
関数名を「pg_」から「mysql_」に置換

mysql_fetch_objectは行番号指定で取得できないので、
mysql_data_seekでポインタ位置を指定する。

■福問い合わせ
サブクエリがまず展開されるので、サブクエリに無用な結果が含まれると
総当たりとなり、膨大になる。(反応遅い)
サブクエリのSELECT文はできるだけ条件を入れた方が良い。

UPDATE a_table,(SELECT * FROM b_table)o_table SET a_table.name=o_table.oldname where a_table.code=o_table.code and o_table.num=1;

UPDATE a_table,(SELECT * FROM b_table where num=1)o_table SET a_table.name=o_table.oldname where a_table.code=o_table.code;

■mysqlでは正規表現による置換が出来ない
これは面倒だったし、今回はpostgresに持ってって処理した。
ある特定の文字に挟まれた数値データをとりだしたかっただけなので、
それでいけたけれど、文字コードに影響される様な文字列だったらそれはできないし、
ステップ踏むしかないかな。
phpでREGEXPとREPLACEを使って置換する方法をとるとか。

以上、私のメモ書き。
素人なので表現や方法が間違ってるかもしれません。

昔は丸付き文字なんか、利用者の方に制限させて、
文字化けしたら利用者のせいにするとか普通だったけど、
今は丸付き文字も機種依存文字も使うもんね。
私は今も使わないけど。
“postgreSQLからmysqlへの移行で気を付けたい点” の続きを読む

Movabletypeを別サーバーに引っ越しする際の注意点

MT/MySQLの引っ越しの手順

MTが使用しているDBをダンプ

ダンプにとくに設定機能はなかったので、
一度、別サーバーのDBにリストアし、
都合の良い形にダンプし直す。

自社サーバーにアップし、
作成するクエリの最大長を300にしてエクスポート

新サーバーは大きいファイルがダンプ出来ないため、
bigdumpを使用する。
http://www.ozerov.de/bigdump/

http://新しいサーバー/sql/bigdump.php

phpmyadminの画面からは日本語テキストが化けていないが、
MTの管理画面では化けている。
どいうこと??

ご利用環境の Perl のバージョンに依存して発生する現象となります。Perl 5.6.1 の環境において、Movable Type 4.2 以降のバージョンへのアップグレード、または新規インストールを行った場合に発生します。下記のリンクから、ファイルをダウンロードし適用することで、問題を回避することができます。

MT4.2-Perl5.6.1Patch.zip

適用方法:
 
ダウンロードした zip ファイルを展開
 
サーバー上の以下のパスが指すディレクトリ内のLocaleディレクトリを削除
(Movable Type 4.2 をアップロードしたディレクトリ) /extlib
zip ファイル展開後のextlib内にあるLocaleフォルダを、上記extlibディレクトリ以下にアップロード

解決した!

文字コードの問題は大変厄介。
DB作る際に、最初からきっちり文字コードを指定しておかないと
余計な手間がかかるので注意しなくてはいけない。
“Movabletypeを別サーバーに引っ越しする際の注意点” の続きを読む

テーブルcreate データのインポート

phpMyadminからsqlコマンドのフォームにcreate文をいれ、テーブルを作成。

データのインポートでひっかかった。

「LOAD DATA する CSV」を選択し、実行。
インポートするファイルの文字コードと改行コードの問題だったようで、
EUCの改行コードがCRLFだったのがマズかったみたい。
LFに保存し直したらうまくいった。

ほっと一安心。
“テーブルcreate データのインポート” の続きを読む

mysql サーバ移転 テーブルデータ書き出し

テーブル構造は取得できたので、内用をcsvファイルに書き出す。

// 定義
$dir = ‘/backup/’
$mcsv = ‘table’;
$my_table = ‘my_table’;
// $my_tableテーブルを呼び出す
$rs = mysql_query(“SELECT * FROM “.$my_table);
// $my_tableテーブルのフィールド数
$fields = mysql_num_fields($rs);
if(!$fields) return;
// ループ処理
while($row = mysql_fetch_array($rs)) {
for($j=0; $j< $fields; $j++) {
// $dataにデータを蓄積
$data .= ‘”‘.addslashes($row[$j]).'”‘;
if($j< $fields-1) $data .= ',';
}
$data .= “\n”;
}
// $dataから余計な文字列を取り除く
$a = substr($data, 0, 5);
if($a == ‘Array’) $data = strstr($data, ‘Array’);
// CSVファイルを呼び出す(※なければ新たに作成)
$fp = @fopen($dir.$mcsv.”.csv”, “a”);
// CSVファイルに$dataを追加挿入
@fputs($fp, $data);
// CSVファイルを閉じる
@fclose($fp);

うまく書き出せた。件数は多くなかった。
機種依存文字がある...。

次は新サーバでの設定。
“mysql サーバ移転 テーブルデータ書き出し” の続きを読む

mysql サーバ移転 テーブルコピー

ターミナルからdumpが使えない場合の引っ越し手順覚え書き。

今回の移転作業は、移転もとの DBが業者の専用の物であり、他のクライアントと共用であると推測されるため、このような手順をとる。

MySQLDump 2.0というクラスをダウンロードし、phpファイルから実行するとdumpファイルを出力するというもの。

でも、なぜかこれができなかったので、手動で情報を取得する。

まずテーブルのリストを取得。

$dbname = ‘mysql_dbname’;

if (!mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’)) {
echo ‘Could not connect to mysql’;
exit;
}

$sql = “SHOW TABLES FROM $dbname”;
$result = mysql_query($sql);

if (!$result) {
echo “DB Error, could not list tables\n”;
echo ‘MySQL Error: ‘ . mysql_error();
exit;
}

while ($row = mysql_fetch_row($result)) {
echo “Table: {$row[0]}\n”;
}

mysql_free_result($result);

幸いにも2個しかテーブルが無いようだ。

テーブルの構造を取得

$result = mysql_query(“SHOW COLUMNS FROM sometable”);
if (!$result) {
echo ‘Could not run query: ‘ . mysql_error();
exit;
}
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
}
}

後はselect分でcsvを吐き出して、それを取り込むか。続きは明日。
“mysql サーバ移転 テーブルコピー” の続きを読む