如何使用ThinkPHP6實現數據庫備份與恢復

在開發業務系統過程中,數據庫是非常重要的一環。因此,對數據庫進行備份和恢復是非常必要的操作。本文將結合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'         =&gt; '',     // 服務器地址     'hostname'    =&gt; 'localhost',     // 數據庫名     'database'    =&gt; 'test',     // 數據庫用戶名     'username'    =&gt; 'root',     // 數據庫密碼     'password'    =&gt; 'root',     // 數據庫連接端口     'hostport'    =&gt; '3306',     // 數據庫連接參數     'params'      =&gt; [],     // 數據庫編碼默認采用utf8     'charset'     =&gt; 'utf8',     // 數據庫表前綴     'prefix'      =&gt; 'think_',     // 數據庫調試模式     'debug'       =&gt; false,     // 數據庫備份路徑,沒有則自動創建     'path'        =&gt; '',     // 數據庫備份卷大小,單位為字節,設為0表示不限制備份大小     'part'        =&gt; 20971520,     // 數據庫備份文件壓縮格式,這里是gzip     'compress'    =&gt; 'gzip',     // 數據庫備份文件名     'filename'    =&gt; '',     // 數據庫備份文件是否需要壓縮     'zip'         =&gt; true,     // 數據庫備份文件是否需要分卷備份     'split'       =&gt; true,     // 數據庫備份時是否將存儲過程和觸發器一起備份     'level'       =&gt; 9,     // 數據庫備份文件的存儲路徑,最好為絕對路徑,這也是最關鍵的路徑     'path'        =&gt; '/data/mysql/', ];

1.2.2 編寫備份代碼

在app/controller下創建BackupController.php文件,并添加以下代碼。

acadeDb;  class BackupController {     protected $backupConfig;      public function __construct()     {         $this-&gt;backupConfig = config('database');     }      public function backup()     {         // 防止備份數據過程超時         set_time_limit(0);          $database = $this-&gt;backupConfig['database'];         $filename = date('Ymd-His', time()) . ".sql";         $path = $this-&gt;backupConfig['path'].$filename;          // 檢查目錄是否存在或者是否有權限寫入         if(!is_dir($this-&gt;backupConfig['path'])){             mkdir($this-&gt;backupConfig['path'], 0755, true);         }else{             if(!is_writeable($this-&gt;backupConfig['path'])){                 chmod($this-&gt;backupConfig['path'], 0755);             }         }          // 備份所有數據表         $result = Db::query("SHOW TABLES");          $tables = array();         foreach($result as $index =&gt; $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-&gt;backupTableSchema($table);             $content = $content . "/*" . PHP_EOL;             $content = $content . "表數據:" . PHP_EOL;             $content = $content . "*/" . PHP_EOL;             $content = $content . $this-&gt;buildInsertSql($table);         }          // 是否需要壓縮         if ($this-&gt;backupConfig['zip']) {             $zip = new ZipArchive();             $zipfilename = $this-&gt;backupConfig['path'] . date('Ymd-His', time()) . ".zip";             if ($zip-&gt;open($zipfilename, ZipArchive::OVERWRITE) === TRUE) {                 $zip-&gt;addFile($path,$filename);                 $zip-&gt;close();                 // 刪除非壓縮的文件                 unlink($path);             } else {                 // 備份失敗             }         }     }      // 備份表結構     protected function backupTableSchema($table)     {         $database = $this-&gt;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-&gt;backupConfig['database'];         $result = Db::query("SELECT * FROM `" . $table . "`");         $insert = '';         foreach ($result as $key =&gt; $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-&gt;backupConfig = config('database');     }      public function recovery()     {         // 防止還原數據過程超時         set_time_limit(0);         ini_set('memory_limit', '1024M');          $filename = input('get.filename');          // 讀取備份文件         if ($this-&gt;backupConfig['zip']) {             $zip = new ZipArchive();             if ($zip-&gt;open($this-&gt;backupConfig['path'].$filename) === true) {                 $filename = $zip-&gt;getNameIndex(0);                 $zip-&gt;extractTo($this-&gt;backupConfig['path']);                 $zip-&gt;close();             }         }          $content = file_get_contents($this-&gt;backupConfig['path'] . $filename);          // 使用";"分割內容         $statements = explode(";", $content);          // 開始事務         Db::startTrans();          foreach ($statements as $index =&gt; $stmt) {             if (trim($stmt) === '') {                 continue;             }             $results = Db::query($stmt);             if ($results === false) {                 Db::rollback();                 return false;             }         }          // 提交事務         Db::commit();          // 刪除非壓縮的文件         unlink($this-&gt;backupConfig['path'] . $filename);          return true;     } }

1.3.2 執行恢復

在瀏覽器中輸入以下url地址即可執行恢復:

http://localhost/recovery/recovery?filename=20200101-121212.sql.zip

以上為ThinkPHP6實現數據庫備份與恢復的實現方法,讀者可以將代碼應用到自己的項目中,靈活運用其中的技巧,讓我們的業務更加健壯可靠。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享