backup.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. require_once __DIR__ . '/../vendor/autoload.php';
  3. $app = require_once __DIR__ . '/../bootstrap/app.php';
  4. $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
  5. $kernel->bootstrap();
  6. use Illuminate\Support\Facades\DB;
  7. echo "开始备份数据库...\n\n";
  8. // 创建备份内容
  9. $tables = DB::select('SHOW TABLES');
  10. $dump = "-- MySQL Database Backup\n";
  11. $dump .= "-- Generated on: " . date('Y-m-d H:i:s') . "\n";
  12. $dump .= "-- Database: math\n\n";
  13. foreach ($tables as $table) {
  14. $tableName = array_values((array)$table)[0];
  15. echo "备份表: $tableName\n";
  16. // 获取建表语句
  17. $createTable = DB::select('SHOW CREATE TABLE ' . $tableName);
  18. if (isset($createTable[0])) {
  19. $dump .= "--\n-- Table structure for table `$tableName`\n--\n";
  20. $dump .= "DROP TABLE IF EXISTS `$tableName`;\n";
  21. $dump .= $createTable[0]->{'Create Table'} . ";\n\n";
  22. }
  23. // 获取表数据
  24. $dump .= "--\n-- Dumping data for table `$tableName`\n--\n";
  25. // 分批获取数据以避免内存问题
  26. $offset = 0;
  27. $limit = 1000;
  28. do {
  29. $data = DB::table($tableName)->offset($offset)->limit($limit)->get();
  30. foreach ($data as $row) {
  31. $values = [];
  32. $columns = [];
  33. foreach ((array)$row as $key => $value) {
  34. if (is_numeric($key)) continue; // 跳过数字索引
  35. $columns[] = "`$key`";
  36. if ($value === null) {
  37. $values[] = 'NULL';
  38. } elseif (is_string($value)) {
  39. // 处理特殊字符
  40. $value = str_replace(["\n", "\r", "\t"], ["\\n", "\\r", "\\t"], $value);
  41. $values[] = "'" . addslashes($value) . "'";
  42. } elseif (is_bool($value)) {
  43. $values[] = $value ? '1' : '0';
  44. } elseif (is_float($value) || is_double($value)) {
  45. $values[] = sprintf('%F', $value);
  46. } else {
  47. $values[] = $value;
  48. }
  49. }
  50. $dump .= "INSERT INTO `$tableName` (" . implode(', ', $columns) . ") VALUES (" . implode(', ', $values) . ");\n";
  51. }
  52. $offset += $limit;
  53. } while ($data->count() == $limit);
  54. $dump .= "\n";
  55. }
  56. // 保存备份文件
  57. $filename = __DIR__ . '/backup_math_' . date('Y-m-d_H-i-s') . '.sql';
  58. file_put_contents($filename, $dump);
  59. echo "\n备份完成!\n";
  60. echo "备份文件: $filename\n";
  61. echo "文件大小: " . number_format(filesize($filename) / 1024 / 1024, 2) . " MB\n";