兩個 Discuz! 論壇合並,用戶量 12 萬與 1.8 萬。決定保留大站,將小站用戶直接導入大站 pre_ucenter_members 表,快速實現賬號遷移。
pre_ucenter_members 表結構與數據為 SQL 文件set_time_limit(0);
ini_set('memory_limit', '512M');
$link = mysqli_connect('localhost', 'db_user', 'db_pass', 'target_db')
or die('DB連接失敗: ' . mysqli_connect_error());
mysqli_set_charset($link, 'utf8mb4');
require 'small_site_uc_members.sql.php'; // 返回 $sqlArr = [...]
$ok = 0; $err = 0; $errors = [];
mysqli_query($link, "SET NAMES utf8mb4");
foreach ($sqlArr as $sql) {
if (mysqli_query($link, $sql)) {
$ok++;
} else {
$err++;
$errors[] = [
'sql' => $sql,
'error' => mysqli_error($link),
'errno' => mysqli_errno($link),
];
}
}
echo "導入完成: 成功 $ok, 失敗 $err\n";
if ($errors) {
error_log(print_r($errors, true), 3, __DIR__ . '/import_errors.log');
echo "錯誤詳情已寫入 import_errors.log\n";
}
mysqli_close($link);
# 使用 mysqldump 導出純數據 INSERT 語句 mysqldump -u user -p --no-create-info --compact --skip-extended-insert \ source_db pre_ucenter_members > small_site_uc_members.sql # 轉換為 PHP 數組文件 (small_site_uc_members.sql.php) # 簡單腳本: 讀取 SQL 文件,按分號分割,生成 $sqlArr = [...];
| 問題 | 影響 | 緩解措施 |
|---|---|---|
| UID 衝突 | 主鍵重複導入失敗 | 導入前檢查大站最大 UID,小站 UID 整體偏移 (UPDATE uid = uid + offset) |
| 關聯數據缺失 | 積分、好友、帖子、動態等不遷移 | 僅適用於「棄用小站、僅保留賬號登錄」場景 |
| 密碼加密差異 | Discuz! 版本不同導致 password/salt 算法不一致 | 確認兩站 UC_KEY 相同,或統一重置密碼通知用戶 |
| 性能瓶頸 | 大量單條 INSERT 耗時極長 | SQL 使用 INSERT ... VALUES (...),(...),... 批量插入,或 LOAD DATA INFILE |
// 解析 SQL 文件,提取 VALUES 部分,組裝批量 INSERT
$batch = [];
$batchSize = 500;
foreach ($sqlArr as $sql) {
if (preg_match("/INSERT INTO .*? VALUES \((.+)\);/s", $sql, $m)) {
$batch[] = $m[1];
if (count($batch) >= $batchSize) {
$multiSql = "INSERT INTO pre_ucenter_members (uid, username, password, email, ...) VALUES " . implode(',', $batch);
mysqli_query($link, $multiSql);
$batch = [];
}
}
}
if ($batch) {
$multiSql = "INSERT INTO pre_ucenter_members (...) VALUES " . implode(',', $batch);
mysqli_query($link, $multiSql);
}
參考文章 ID 59156《PHP 合並 Discuz! 用戶數據的兩種方案:直接導入與 UCenter 整合》 獲取 UCenter 官方整合方案,實現雙向同步、數據完整、長期運營無憂。