Commit 2b37a47a authored by platyhouse's avatar platyhouse

# MySQL 백업 스크립트 로깅 기능 개선

## 로깅 시스템 개선

### 타임스탬프 출력 기능 추가
- **ptyMysqlBackup.php**:
  - logMessage() 함수 추가로 모든 출력에 타임스탬프 자동 포함
  - 기존 echo 호출을 logMessage()로 전면 교체
  - 에러 발생 시 exit(1)로 명시적 종료 코드 반환
parent fe6f01ca
#!/usr/bin/php #!/usr/bin/php
<?php <?php
// 타임스탬프를 포함한 출력 함수
function logMessage($message) {
$timestamp = date('Y-m-d H:i:s');
echo "[$timestamp] $message";
}
// 인자 파싱 함수 (--key=value 형태만 허용) // 인자 파싱 함수 (--key=value 형태만 허용)
function parseArguments($argv) { function parseArguments($argv) {
$args = []; $args = [];
...@@ -10,8 +16,8 @@ function parseArguments($argv) { ...@@ -10,8 +16,8 @@ function parseArguments($argv) {
} elseif (preg_match('/^--([a-zA-Z]+)=(.*)$/', $argv[$i], $matches)) { } elseif (preg_match('/^--([a-zA-Z]+)=(.*)$/', $argv[$i], $matches)) {
$args[$matches[1]] = $matches[2]; $args[$matches[1]] = $matches[2];
} else { } else {
echo "[WARNING] Invalid argument format: {$argv[$i]}\n"; logMessage("[WARNING] Invalid argument format: {$argv[$i]}\n");
echo " Use --key=value format (e.g., --host=localhost)\n\n"; logMessage(" Use --key=value format (e.g., --host=localhost)\n\n");
} }
} }
return $args; return $args;
...@@ -55,25 +61,25 @@ if (!$backupPath) $backupPath = "/root/pty_server_backup/mysql"; ...@@ -55,25 +61,25 @@ if (!$backupPath) $backupPath = "/root/pty_server_backup/mysql";
if (!$password) if (!$password)
{ {
// 먼저 로컬 ~/.mysql_password 체크 // 먼저 로컬 ~/.mysql_password 체크
echo "[INFO] Checking local ~/.mysql_password file...\n"; logMessage("[INFO] Checking local ~/.mysql_password file...\n");
$passwordFile = getenv("HOME") . "/.mysql_password"; $passwordFile = getenv("HOME") . "/.mysql_password";
if (file_exists($passwordFile)) { if (file_exists($passwordFile)) {
$password = trim(file_get_contents($passwordFile)); $password = trim(file_get_contents($passwordFile));
echo "[INFO] Password loaded from local ~/.mysql_password\n"; logMessage("[INFO] Password loaded from local ~/.mysql_password\n");
} else { } else {
echo "[INFO] Local ~/.mysql_password not found\n"; logMessage("[INFO] Local ~/.mysql_password not found\n");
} }
// 로컬에 없고 호스트가 localhost가 아니면 SSH로 원격 호스트에서 가져오기 // 로컬에 없고 호스트가 localhost가 아니면 SSH로 원격 호스트에서 가져오기
if (!$password && $host != "localhost" && $host != "127.0.0.1") { if (!$password && $host != "localhost" && $host != "127.0.0.1") {
echo "[INFO] Trying to get password from remote host ($host)...\n"; logMessage("[INFO] Trying to get password from remote host ($host)...\n");
$sshCmd = "ssh root@$host 'cat ~/.mysql_password' 2>/dev/null"; $sshCmd = "ssh root@$host 'cat ~/.mysql_password' 2>/dev/null";
$remotePassword = trim(shell_exec($sshCmd)); $remotePassword = trim(shell_exec($sshCmd));
if ($remotePassword) { if ($remotePassword) {
$password = $remotePassword; $password = $remotePassword;
echo "[INFO] Password loaded from remote host = $password\n"; logMessage("[INFO] Password loaded from remote host = $password\n");
} else { } else {
echo "[INFO] Remote ~/.mysql_password not found\n"; logMessage("[INFO] Remote ~/.mysql_password not found\n");
} }
} }
} }
...@@ -105,23 +111,25 @@ if (!$password) ...@@ -105,23 +111,25 @@ if (!$password)
// 백업 디렉토리 생성 // 백업 디렉토리 생성
if (!is_dir($backupPath)) { if (!is_dir($backupPath)) {
echo "[INFO] Creating backup directory: $backupPath\n"; logMessage("[INFO] Creating backup directory: $backupPath\n");
if (!mkdir($backupPath, 0755, true)) { if (!mkdir($backupPath, 0755, true)) {
die("[ERROR] Failed to create backup directory: $backupPath\n"); logMessage("[ERROR] Failed to create backup directory: $backupPath\n");
exit(1);
} }
} }
echo "\n[INFO] Backup path: $backupPath\n"; logMessage("\n[INFO] Backup path: $backupPath\n");
echo "[INFO] Connecting to MySQL server: $host as $user, password = $password\n"; logMessage("[INFO] Connecting to MySQL server: $host as $user, password = $password\n");
$connection = mysqli_connect($host, $user, $password); $connection = mysqli_connect($host, $user, $password);
if (!$connection) { if (!$connection) {
die ('[ERROR] Could not connect database.' . mysqli_error()."\n"); logMessage('[ERROR] Could not connect database.' . mysqli_error()."\n");
exit(1);
} }
echo "[INFO] Connected successfully!\n\n"; logMessage("[INFO] Connected successfully!\n\n");
echo "[INFO] Retrieving database list...\n"; logMessage("[INFO] Retrieving database list...\n");
$databases = mysqli_query($connection, "SHOW databases"); $databases = mysqli_query($connection, "SHOW databases");
$dbCount = 0; $dbCount = 0;
$totalTables = 0; $totalTables = 0;
...@@ -130,21 +138,21 @@ while ($databaseInfo = mysqli_fetch_array($databases)) { // go through each row ...@@ -130,21 +138,21 @@ while ($databaseInfo = mysqli_fetch_array($databases)) { // go through each row
# performance_schema, information_schema 는 백업 무시 # performance_schema, information_schema 는 백업 무시
if ($dbName == "performance_schema" || $dbName == "information_schema") { if ($dbName == "performance_schema" || $dbName == "information_schema") {
echo "[SKIP] Skipping system database: $dbName\n"; logMessage("[SKIP] Skipping system database: $dbName\n");
continue; continue;
} }
$dbCount++; $dbCount++;
echo "\n====================================\n"; logMessage("\n====================================\n");
echo "[DB $dbCount] Processing database: $dbName\n"; logMessage("[DB $dbCount] Processing database: $dbName\n");
echo "====================================\n"; logMessage("====================================\n");
$sql = "SHOW TABLES FROM `$dbName`"; $sql = "SHOW TABLES FROM `$dbName`";
$result = mysqli_query($connection, $sql); $result = mysqli_query($connection, $sql);
if (!$result) { if (!$result) {
echo "[ERROR] DB Error, could not list tables\n"; logMessage("[ERROR] DB Error, could not list tables\n");
echo '[ERROR] MySQL Error: ' . mysqli_error($connection) . "\n"; logMessage('[ERROR] MySQL Error: ' . mysqli_error($connection) . "\n");
exit; exit;
} }
...@@ -155,18 +163,18 @@ while ($databaseInfo = mysqli_fetch_array($databases)) { // go through each row ...@@ -155,18 +163,18 @@ while ($databaseInfo = mysqli_fetch_array($databases)) { // go through each row
} }
$totalTablesInDb = count($tables); $totalTablesInDb = count($tables);
echo "[INFO] Found $totalTablesInDb tables in $dbName\n"; logMessage("[INFO] Found $totalTablesInDb tables in $dbName\n");
foreach ($tables as $tableName) { foreach ($tables as $tableName) {
$tableCount++; $tableCount++;
echo "[TABLE $tableCount/$totalTablesInDb] Backing up: $dbName.$tableName ... "; logMessage("[TABLE $tableCount/$totalTablesInDb] Backing up: $dbName.$tableName ... ");
mysql_backup($host, $user, $password, $dbName, $tableName, $backupPath); mysql_backup($host, $user, $password, $dbName, $tableName, $backupPath);
echo "Done\n"; logMessage("Done\n");
$totalTables++; $totalTables++;
} }
// 데이터베이스 백업 완료 후 압축 // 데이터베이스 백업 완료 후 압축
echo "[INFO] Compressing database backup...\n"; logMessage("[INFO] Compressing database backup...\n");
$dbDir = $backupPath . "/" . $dbName; $dbDir = $backupPath . "/" . $dbName;
$tarFile = $backupPath . "/" . $dbName . ".tgz"; $tarFile = $backupPath . "/" . $dbName . ".tgz";
...@@ -175,25 +183,25 @@ while ($databaseInfo = mysqli_fetch_array($databases)) { // go through each row ...@@ -175,25 +183,25 @@ while ($databaseInfo = mysqli_fetch_array($databases)) { // go through each row
exec($tarCmd, $tarOutput, $tarReturnCode); exec($tarCmd, $tarOutput, $tarReturnCode);
if ($tarReturnCode === 0) { if ($tarReturnCode === 0) {
echo "[INFO] Compressed to: $tarFile\n"; logMessage("[INFO] Compressed to: $tarFile\n");
// 압축 성공 시 원본 디렉토리 삭제 // 압축 성공 시 원본 디렉토리 삭제
echo "[INFO] Removing original directory...\n"; logMessage("[INFO] Removing original directory...\n");
$rmCmd = "rm -rf \"$dbDir\""; $rmCmd = "rm -rf \"$dbDir\"";
exec($rmCmd); exec($rmCmd);
echo "[INFO] Original directory removed\n"; logMessage("[INFO] Original directory removed\n");
} else { } else {
echo "[ERROR] Failed to compress $dbName\n"; logMessage("[ERROR] Failed to compress $dbName\n");
echo implode("\n", $tarOutput) . "\n"; logMessage(implode("\n", $tarOutput) . "\n");
} }
} }
echo "\n====================================\n"; logMessage("\n====================================\n");
echo "[COMPLETE] Backup finished!\n"; logMessage("[COMPLETE] Backup finished!\n");
echo "[STATS] Backup path: $backupPath\n"; logMessage("[STATS] Backup path: $backupPath\n");
echo "[STATS] Total databases: $dbCount\n"; logMessage("[STATS] Total databases: $dbCount\n");
echo "[STATS] Total tables: $totalTables\n"; logMessage("[STATS] Total tables: $totalTables\n");
echo "====================================\n"; logMessage("====================================\n");
function mysql_backup($host, $user, $password, $dbName, $tableName, $backupPath) function mysql_backup($host, $user, $password, $dbName, $tableName, $backupPath)
{ {
...@@ -215,8 +223,8 @@ function mysql_backup($host, $user, $password, $dbName, $tableName, $backupPath) ...@@ -215,8 +223,8 @@ function mysql_backup($host, $user, $password, $dbName, $tableName, $backupPath)
exec($cmd, $output, $returnCode); exec($cmd, $output, $returnCode);
if ($returnCode !== 0) { if ($returnCode !== 0) {
echo "\n[ERROR] Failed to backup $dbName.$tableName\n"; logMessage("\n[ERROR] Failed to backup $dbName.$tableName\n");
echo implode("\n", $output) . "\n"; logMessage(implode("\n", $output) . "\n");
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment