在開發業務系統過程中,數據庫是非常重要的一環。因此,對數據庫進行備份和恢復是非常必要的操作。本文將結合thinkphp6框架實例,介紹如何使用thinkphp6實現數據庫備份與恢復。
一、數據庫備份
1.1 環境準備
在進行數據庫備份之前,需要確認如下幾點:
1、需要設置好mysql數據庫的bin目錄地址,并把其路徑加入系統Path變量中;
立即學習“PHP免費學習筆記(深入)”;
2、需要安裝好mysqldump命令行工具;
3、確認在數據庫所在的機器上,執行備份的用戶,有對數據庫執行mysqldump命令的權限。
1.2 數據庫備份實現
1.2.1 配置備份參數
在config文件夾下創建database.php文件,設置數據庫連接信息和備份所需參數。
<?php return [ // 數據庫類型 'type' => 'mysql', // 數據庫連接DSN配置 'dsn' => '', // 服務器地址 'hostname' => 'localhost', // 數據庫名 'database' => 'test', // 數據庫用戶名 'username' => 'root', // 數據庫密碼 'password' => 'root', // 數據庫連接端口 'hostport' => '3306', // 數據庫連接參數 'params' => [], // 數據庫編碼默認采用utf8 'charset' => 'utf8', // 數據庫表前綴 'prefix' => 'think_', // 數據庫調試模式 'debug' => false, // 數據庫備份路徑,沒有則自動創建 'path' => '', // 數據庫備份卷大小,單位為字節,設為0表示不限制備份大小 'part' => 20971520, // 數據庫備份文件壓縮格式,這里是gzip 'compress' => 'gzip', // 數據庫備份文件名 'filename' => '', // 數據庫備份文件是否需要壓縮 'zip' => true, // 數據庫備份文件是否需要分卷備份 'split' => true, // 數據庫備份時是否將存儲過程和觸發器一起備份 'level' => 9, // 數據庫備份文件的存儲路徑,最好為絕對路徑,這也是最關鍵的路徑 'path' => '/data/mysql/', ];
1.2.2 編寫備份代碼
在app/controller下創建BackupController.php文件,并添加以下代碼。
acadeDb; class BackupController { protected $backupConfig; public function __construct() { $this->backupConfig = config('database'); } public function backup() { // 防止備份數據過程超時 set_time_limit(0); $database = $this->backupConfig['database']; $filename = date('Ymd-His', time()) . ".sql"; $path = $this->backupConfig['path'].$filename; // 檢查目錄是否存在或者是否有權限寫入 if(!is_dir($this->backupConfig['path'])){ mkdir($this->backupConfig['path'], 0755, true); }else{ if(!is_writeable($this->backupConfig['path'])){ chmod($this->backupConfig['path'], 0755); } } // 備份所有數據表 $result = Db::query("SHOW TABLES"); $tables = array(); foreach($result as $index => $row){ $tables[] = $row['Tables_in_'.$database]; } // 備份所有表結構和表數據 $content = ''; foreach($tables as $table){ $content = $content . "/*" . PHP_EOL; $content = $content . "表名:" . $table . PHP_EOL; $content = $content . "表結構:" . PHP_EOL; $content = $content . "*/" . PHP_EOL; $content = $content . $this->backupTableSchema($table); $content = $content . "/*" . PHP_EOL; $content = $content . "表數據:" . PHP_EOL; $content = $content . "*/" . PHP_EOL; $content = $content . $this->buildInsertSql($table); } // 是否需要壓縮 if ($this->backupConfig['zip']) { $zip = new ZipArchive(); $zipfilename = $this->backupConfig['path'] . date('Ymd-His', time()) . ".zip"; if ($zip->open($zipfilename, ZipArchive::OVERWRITE) === TRUE) { $zip->addFile($path,$filename); $zip->close(); // 刪除非壓縮的文件 unlink($path); } else { // 備份失敗 } } } // 備份表結構 protected function backupTableSchema($table) { $database = $this->backupConfig['database']; $result = Db::query("SHOW CREATE TABLE `" . $table . "`"); $create = $result[0]['Create Table'] . ";" . PHP_EOL.PHP_EOL; return $create; } // 備份表數據 protected function buildInsertSql($table) { $database = $this->backupConfig['database']; $result = Db::query("SELECT * FROM `" . $table . "`"); $insert = ''; foreach ($result as $key => $value) { $keys = array_keys($value); $values = array_map(array(Db::class, 'quote'), array_values($value)); $values = join(",", $values); $insert .= "INSERT INTO `" . $table . "` (`" . join("`,`", $keys) . "`) VALUES (" . $values . ");" . PHP_EOL; } $insert .= PHP_EOL; return $insert; } }
1.2.3 執行備份
在瀏覽器中輸入以下url地址即可執行備份:
http://localhost/backup/backup
1.3 數據庫恢復
1.3.1 編寫恢復代碼
在app/controller下創建RecoveryController.php文件,并添加以下代碼。
acadeDb; class RecoveryController { protected $backupConfig; public function __construct() { $this->backupConfig = config('database'); } public function recovery() { // 防止還原數據過程超時 set_time_limit(0); ini_set('memory_limit', '1024M'); $filename = input('get.filename'); // 讀取備份文件 if ($this->backupConfig['zip']) { $zip = new ZipArchive(); if ($zip->open($this->backupConfig['path'].$filename) === true) { $filename = $zip->getNameIndex(0); $zip->extractTo($this->backupConfig['path']); $zip->close(); } } $content = file_get_contents($this->backupConfig['path'] . $filename); // 使用";"分割內容 $statements = explode(";", $content); // 開始事務 Db::startTrans(); foreach ($statements as $index => $stmt) { if (trim($stmt) === '') { continue; } $results = Db::query($stmt); if ($results === false) { Db::rollback(); return false; } } // 提交事務 Db::commit(); // 刪除非壓縮的文件 unlink($this->backupConfig['path'] . $filename); return true; } }
1.3.2 執行恢復
在瀏覽器中輸入以下url地址即可執行恢復:
http://localhost/recovery/recovery?filename=20200101-121212.sql.zip
以上為ThinkPHP6實現數據庫備份與恢復的實現方法,讀者可以將代碼應用到自己的項目中,靈活運用其中的技巧,讓我們的業務更加健壯可靠。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END