在開發業務系統過程中,數據庫是非常重要的一環。因此,對數據庫進行備份和恢復是非常必要的操作。本文將結合ThinkPHP6框架實例,介紹如何使用ThinkPHP6實現數據庫備份與恢復。
一、數據庫備份
1.1 環境準備
在進行數據庫備份之前,需要確認如下幾點:
1、需要設置好mysql數據庫的bin目錄地址,并把其路徑加入系統Path變量中;
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文件,并添加以下代碼。
<?php
declare(strict_types=1);
namespace appcontroller;
use thinkacadeDb;
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文件,并添加以下代碼。
<?php
declare(strict_types=1);
namespace appcontroller;
use thinkacadeDb;
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實現數據庫備份與恢復的實現方法,讀者可以將代碼應用到自己的項目中,靈活運用其中的技巧,讓我們的業務更加健壯可靠。
以上就是如何使用ThinkPHP6實現數據庫備份與恢復的詳細內容,更多請關注www.xfxf.net其它相關文章!






