Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. <?php
  2.  
  3. $args = ParseArgs();
  4.  
  5. $src_db = $args["src_db"];
  6. $target_db = $src_db . "_restore";
  7. $backup_folder = $args["backup_folder"];
  8. $backup_folder .= $src_db;
  9. $src_db_folder = $args["mysql_data_dir"] . $src_db;
  10. $target_db_folder = $args["mysql_data_dir"] . $target_db;
  11. $mysql_user = $args["user"];
  12. $mysql_pass = $args["password"];
  13. $log_file = $args["log_file"];
  14.  
  15. $file_list = scandir($src_db_folder);
  16. $file_list = array_filter($file_list, function($file_name){return (strpos($file_name, ".ibd") !== false);});
  17.  
  18.  
  19. $log_output = LogMsg("\nCreating target database: " . $target_db."\n");
  20. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " -e 'DROP DATABASE IF EXISTS " . $target_db . ";CREATE DATABASE " . $target_db . "'");
  21. $log_output .= LogMsg("Restoring " . count(array_values($file_list)) . " tables from " . $src_db . " database\n\n");
  22.  
  23. $count = 0;
  24. foreach ($file_list as $index => $data_file_name) {
  25. $frm_file_name = str_replace(".ibd", ".frm", $data_file_name);
  26. $table_name = str_replace(".ibd", "", $data_file_name);
  27. $export_frm = "mysqlfrm --server='" .$mysql_user . ":" . $mysql_pass . "@localhost' " . $src_db_folder . "/" . $frm_file_name . " --port=3307 --user=root\n";
  28. $cmd = shell_exec($export_frm);
  29. $cmd = str_replace("WARNING: Using a password on the command line interface can be insecure.", "", $cmd);
  30. $cmd = str_replace($src_db, $target_db, $cmd);
  31. $fh = fopen ("export_frm.sh", "w");
  32. fwrite($fh, $cmd);
  33. fclose($fh);
  34. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " " . $target_db . " < /root/scripts/export_frm.sh");
  35. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " " . $target_db . " -e 'ALTER TABLE " . $table_name . " DISCARD TABLESPACE'");
  36. copy($backup_folder . "/" . $data_file_name, $target_db_folder . "/" . $data_file_name);
  37. echo shell_exec("chown mysql:mysql " . $target_db_folder . "/" . $data_file_name);
  38. echo shell_exec("chmod 660 " . $target_db_folder . "/" . $data_file_name);
  39. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " " . $target_db . " -e 'ALTER TABLE " . $table_name . " IMPORT TABLESPACE'");
  40.  
  41. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " " . $src_db . " -e 'DROP TABLE " . $table_name . "'");
  42. unlink($src_db_folder . "/" . $data_file_name);
  43. echo shell_exec("mysqldump -u " . $mysql_user . " -p" . $mysql_pass . " " . $target_db . " > table_dump.sql");
  44. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " " . $src_db . " < table_dump.sql");
  45. unlink("table_dump.sql");
  46. unlink("export_frm.sh");
  47.  
  48. $row_count = shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " " . $src_db . " -e 'SELECT count(*) AS total FROM " . $table_name . "'");
  49. $row_count = str_replace("total\n", "", $row_count);
  50. $log_output .= LogMsg(($count+1) . ". Restored table: " . $table_name. " with row count: " . $row_count."\n");
  51. $count++;
  52. }
  53.  
  54. SaveLog($log_file, $log_output);
  55. echo shell_exec("mysql -u " . $mysql_user . " -p" . $mysql_pass . " -e 'DROP DATABASE IF EXISTS " . $target_db . "'");
  56.  
  57. function ParseArgs() {
  58. global $argv;
  59.  
  60. $msg = <<<EOT
  61.  
  62. Usage: php restore_innodb.php --src-db --backup-folder --mysql_data_dir --log_file --user --password
  63.  
  64. options:
  65. --src-db: the name of the database containing crashed innodb tables
  66. --backup-folder: the path to the MySQL database directory. it is usually /var/lib/mysql
  67. --mysql_data_dir: the path to the MySQL data folder
  68. --log_file: the path to the log file generated by this script
  69. --user: the MySQL root user
  70. --password: password for the MySQL root user
  71.  
  72. example:
  73.  
  74. php restore_innodb.php --src-db="mysql" --backup-folder="/root/scripts/data-backup/" --mysql_data_dir="/var/lib/mysql" --log_file="/root/scripts/restore_innodb.log" --user="root" --password="root-password"
  75.  
  76.  
  77. EOT;
  78.  
  79. if (count($argv) != 7) die($msg);
  80.  
  81. $args["src-db"] = str_replace("--src-db=", "", $argv[1]);
  82. $args["backup-folder"] = str_replace("--backup-folder=", "", $argv[2]);
  83. $args["mysql_data_dir"] = str_replace("--mysql_data_dir=", "", $argv[3]);
  84. $args["log_file"] = str_replace("--log_file=", "", $argv[4]);
  85. $args["user"] = str_replace("--user=", "", $argv[5]);
  86. $args["password"] = str_replace("--password=", "", $argv[6]);
  87.  
  88. return $args;
  89. }
  90.  
  91. function LogMsg($msg) {
  92. echo $msg;
  93. flush();
  94. return $msg;
  95. }
  96.  
  97. function SaveLog($log_file, $log_output) {
  98. $fh = fopen($log_file, "w");
  99. fwrite($fh, $log_output);
  100. fclose($fh);
  101. }
  102. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement