概要
MySQLのあるDatabaseを全てtruncateするために行なったことを記す。
環境
sakuraのレンタルサーバ スタンダード
背景
sakuraでサーバを借りている。そこでWeb上の色々な情報をスクレイピングして取ってきていたのだが、ある日DB使用が多すぎるとの通知が届いた。
面倒だなぁと思いつつも、お世話になっているのでユーザ削除とかされたら困る。対応した。
今までの対応策
全てをtruncateする方法の多くはコマンドライン上で動くものであった。ただ、これらはLinuxの対応策であり、BSD系は少しコマンドが違う。というか、動かなかった。なので、sakuraでデフォルトで使えるPHPで実装を行なった。pythonも考えたけど、今更2系なんて書きたくないし、root権限なんて当然もらえないのでpipが使えない。面倒だ。よってPHPで行なった。
行なったこと
mysqldumpで自分の領域に持って行く
sakuraのターミナル上で実行
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME
PHPで全てを一括削除する
<?php
try{
$pdo = new PDO("mysql:dbname=DB_NAME;host=HOST_NAME", "USER_NAME", "PASSWORD");
}catch (PDOException $e) {
exit("fail to connect to database".$e->getMessage());
}
try{
$stmt = $pdo->prepare("show tables;");
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_NUM);
} catch (Exception $e) {
exit("fail to fetch data".$e->getMessage());
}
$stmt = $pdo->prepare("SET FOREIGN_KEY_CHECKS=0;");
$stmt->execute();
foreach($results as $result){
$stmt = $pdo->prepare("truncate table `".$result[0]."`");
$stmt->execute();
echo ("truncate table ".$result[0]."\n");
}
$stmt = $pdo->prepare("SET FOREIGN_KEY_CHECKS=1;");
$stmt->execute();
?>
以上にうまくDBなどを設定し、「php all_mysql_truncate.php」で実行完了する。
外部キーのあるところは削除したくなければ、SET FOREIGN_KEY_CHECKS=0;のあたりを実行しないようにすること。
所感
PHPのデータベース接続周りは色々なやり方があるようで..少し戸惑った。
よくある「?」を使ってそこに後からarrayを与える方法は今回は使えなかった。
InsertとUpdate文のためのものなのかしら。