刪除資料庫是不可逆的高風險操作。本文對比 mysqladmin 命令列工具(含互動確認機制)與 PHP mysql_query 程式化刪除(無確認、高效率、高風險)兩種核心方式,提供生產環境標準化操作流程與安全防護清單。
# 1. 以 root 登錄(需 DROP 權限) mysqladmin -u root -p drop TUTORIALS Enter password: ****** # 2. 系統強制確認提示 Dropping the database is potentially a very bad thing to do. Any data stored in the database will be destroyed. Do you really want to drop the 'TUTORIALS' database [y/N] y # 3. 執行結果 Database "TUTORIALS" dropped
bool mysql_query(string $sql, resource $link_identifier = null) -- $sql: DROP DATABASE db_name(不含分號) -- $link_identifier: 連接資源,預設最後開啟連接
<?php
// 配置參數化
$db_host = 'localhost:3036';
$db_user = 'root';
$db_pass = 'rootpassword';
$target_db = 'TUTORIALS';
// 雙重驗證機制
$confirm_token = $_POST['confirm_token'] ?? '';
$expected_token = 'DROP_DB_' . $target_db . '_' . date('Ymd');
if ($confirm_token !== $expected_token) {
die('安全驗證失敗:Token 不匹配,拒絕執行刪除操作。');
}
$conn = mysql_connect($db_host, $db_user, $db_pass);
if (!$conn) {
die('連接失敗: ' . mysql_error());
}
echo '連接成功<br />';
// 執行刪除
$sql = "DROP DATABASE `$target_db`";
$retval = mysql_query($sql, $conn);
if (!$retval) {
die('刪除資料庫失敗: ' . mysql_error());
}
echo "資料庫 $target_db 刪除成功\n";
mysql_close($conn);
?>
| 風險點 | 後果 | 緩解措施 |
|---|---|---|
| 無互動確認 | 腳本錯誤/誤觸發 → 秒級數據清零 | Token 雙重驗證、IP 白名單、操作審計日誌 |
| SQL 注入 | 惡意構造 db_name 執行任意 SQL | 參數化/白名單校驗、反引號包裹識別符 |
| 權限過大 | 腳本帳號可刪除任意庫 | 專用低權限帳號、僅授目標庫 DROP |
| 無備份驗證 | 刪除後發現無可用備份 | 腳本前置檢查:備份存在性、可恢複性驗證 |
mysqldump --single-transaction --routines --triggers db > backup.sql,校驗檔案大小、關鍵表行數SHOW DATABASES LIKE 'db_name' 確認不存在,監控告警恢復正常人工操作用 mysqladmin(有確認)、自動化用腳本(加防護)。核心原則:備份先行、權限最小、雙重驗證、留痕審計、可回滾。建議將刪除操作封裝為標準化 Ansible Playbook / Jenkins Job,參數化目標庫、環境、確認 Token,實現「不可篡改的操作軌跡、可重放的執行過程、可追溯的責任歸屬」。