LoginSignup
0
0

More than 5 years have passed since last update.

sakuraのDB使用制限に対応するTruncate実行

Posted at

概要

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で全てを一括削除する

all_mysql_truncate.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文のためのものなのかしら。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0