さくらレンタルサーバーデータベースをフルバックアップするコード

2025年12月20日
文字数[2388文字] この記事は3分59秒で読めます.

おはようございます.アバターは月曜日か火曜日に観に行くつもりでいますがどうなるかは未定です.本日はさくらレンタルサーバーデータベースをごっそり定期的にフルバックアップするコードを作成したのでその話を書いていきます.このコードはwwwよりも上に出さないで下さい.そこだけが重要なところです、また使用にあたってご自身の環境に合わしてユーザーやパスワードなどを変更して下さい.

因みにこれをクロンやコマンドラインからしか実行出来ないので、定期的にバックアップしたい方はクロンの設定が必要になります.

これらを注意実行とします.あとエラーが出た時に出力するようにしていますが不要な場合は削除またはコメントにして頂いて結構です、そして可変などもご自由にしてください.

追伸:本日、国家試験を受けに行きます、試験結果に関しては時が過ぎたころに書いていくと思います.試験は10時から高知県の県庁前辺りで行われます.たぶん終わるのは12時頃だと思います…

<?php
class SqlBackup
{
    private $user = 'user';
    private $pass = 'pass';
    private $host = 'mysqlXXX.user.sakura.ne.jp';
    private $root = '/home/user/MySqlFullBackup/';//バックアップの置き場所:絶対パス
    private $dblist = [
        "wp_db",
    ];
      
    public function fullBackup(string|null $dir=null)
    {
        $dir = $dir??$this->root;

        if (!is_dir($dir)) {
            return $this;
        }

        try {
            foreach ($this->dblist as $dbname) {
                exec('mysqldump -u ' . $this->user . ' -p' . $this->pass . ' -h ' . $this->host . ' --single-transaction --no-tablespaces ' . $dbname . ' > ' . $dir . date('Y-m-d-H-i_') . $dbname . '.sql 2>/dev/null');
            }
        } catch (\Throwable $th) {
            file_put_contents('bug.txt', $th->getMessage());
        }
        return $this;
    }

    function deleteOldFiles(string|null $dir=null, int $days = 7)
    {
        $dir = $dir??$this->root;

        if (!is_dir($dir)) {
            return $this;
        }

        $deletedCount = 0;
        $limitTime = time() - ($days * 24 * 60 * 60);

        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator(
                $dir,
                FilesystemIterator::SKIP_DOTS
            )
        );

        foreach ($iterator as $file) {
            /** @var SplFileInfo $file */
            if ($file->isFile()) {
                // ファイルの更新日時を取得
                if ($file->getMTime() < $limitTime) {
                    if (@unlink($file->getPathname())) {
                        $deletedCount++;
                    }
                }
            }
        }

        //echo $deletedCount;
        return $this;
    }
}
if ($argv[0]) {
    (new SqlBackup)->fullBackup()->deleteOldFiles();
}

明日へ続く