Я получил этот урок из Интернета. Но я даже не понимаю, как будет работать резервная копия базы данных MySQL через PHP .
Использование PHP для резервного копирования баз данных MySQL
Можете ли вы порекомендовать некоторые сайты, которые я могу использовать в качестве ссылки, чтобы я мог ее изучить?
Хотя вы можете выполнять команды резервного копирования с PHP, они действительно не имеют ничего общего с PHP. Это все о MySQL.
Я бы предложил использовать утилиту mysqldump для резервного копирования базы данных. Документацию можно найти здесь: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html .
Основное использование mysqldump
mysqldump -u user_name -p name-of-database >file_to_write_to.sql
Затем вы можете восстановить резервную копию с помощью команды типа
mysql -u user_name -p <file_to_read_from.sql
У вас есть доступ к cron? Я бы предложил создать PHP-скрипт, который запускает mysqldump в качестве задания cron. Это было бы похоже на
<?php $filename='database_backup_'.date('G_a_m_d_y').'.sql'; $result=exec('mysqldump database_name --password=your_pass --user=root --single-transaction >/var/backups/'.$filename,$output); if($output==''){/* no output is good */} else {/* we have something to log the output here*/}
Если mysqldump недоступен, в статье описывается другой метод, используя команды SELECT INTO OUTFILE
и LOAD DATA INFILE
. Единственное подключение к PHP – это то, что вы используете PHP для подключения к базе данных и выполнения команд SQL. Вы также можете сделать это из командной строки MySQL-программы, монитора MySQL.
Это довольно просто, вы пишете файл SQL с одной командой и загружаете / выполняете его, когда пришло время для восстановления.
Здесь вы можете найти документы для выбора в outfile (просто найдите страницу для outfile). LOAD DATA INFILE – это, по сути, обратное. См. Здесь документы.
пример:
EXPORT_TABLES("localhost","user","pass","db_name" );
код:
<?php // https://github.com/tazotodua/useful-php-scripts //optional: 5th parameter - backup specific tables only: array("mytable1","mytable2",...) //optional: 6th parameter - backup filename // NOTE! to adequatelly replace strings in DB, MUST READ: goo.gl/nCwWsS function EXPORT_TABLES($host,$user,$pass,$name, $tables=false, $backup_name=false){ set_time_limit(3000); $mysqli = new mysqli($host,$user,$pass,$name); $mysqli->select_db($name); $mysqli->query("SET NAMES 'utf8'"); $queryTables = $mysqli->query('SHOW TABLES'); while($row = $queryTables->fetch_row()) { $target_tables[] = $row[0]; } if($tables !== false) { $target_tables = array_intersect( $target_tables, $tables); } $content = "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\nSET time_zone = \"+00:00\";\r\n\r\n\r\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r\n/*!40101 SET NAMES utf8 */;\r\n--\r\n-- Database: `".$name."`\r\n--\r\n\r\n\r\n"; foreach($target_tables as $table){ if (empty($table)){ continue; } $result = $mysqli->query('SELECT * FROM `'.$table.'`'); $fields_amount=$result->field_count; $rows_num=$mysqli->affected_rows; $res = $mysqli->query('SHOW CREATE TABLE '.$table); $TableMLine=$res->fetch_row(); $content .= "\n\n".$TableMLine[1].";\n\n"; for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) { while($row = $result->fetch_row()) { //when started (and every after 100 command cycle): if ($st_counter%100 == 0 || $st_counter == 0 ) {$content .= "\nINSERT INTO ".$table." VALUES";} $content .= "\n("; for($j=0; $j<$fields_amount; $j++){ $row[$j] = str_replace("\n","\\n", addslashes($row[$j]) ); if (isset($row[$j])){$content .= '"'.$row[$j].'"' ;} else{$content .= '""';} if ($j<($fields_amount-1)){$content.= ',';} } $content .=")"; //every after 100 command cycle [or at last line] ....ps but should be inserted 1 cycle eariler if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {$content .= ";";} else {$content .= ",";} $st_counter=$st_counter+1; } } $content .="\n\n\n"; } $content .= "\r\n\r\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;"; $backup_name = $backup_name ? $backup_name : $name."___(".date('Hi-s')."_".date('dm-Y').")__rand".rand(1,11111111).".sql"; ob_get_clean(); header('Content-Type: application/octet-stream'); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"".$backup_name."\""); echo $content; exit; } //see import.php too ?>
// обновляется по совету Мухаммеда.
Вот чистый класс PHP для выполнения резервных копий в базах MySQL, не использующих команды mysqldump или mysql: Резервное копирование баз данных MySQL с использованием чистого PHP
Если вы хотите создать резервную копию базы данных из php-скрипта, вы можете использовать класс, например, позвоните ему MySQL
. Этот класс будет использовать PDO (построить в php-классе, который будет обрабатывать соединение с базой данных). Этот класс может выглядеть так:
<?php /*defined in your exampleconfig.php*/ define('DBUSER','root'); define('DBPASS',''); define('SERVERHOST','localhost'); ?> <?php /*defined in examplemyclass.php*/ class MySql{ private $dbc; private $user; private $pass; private $dbname; private $host; function __construct($host="localhost", $dbname="your_databse_name_here", $user="your_username", $pass="your_password"){ $this->user = $user; $this->pass = $pass; $this->dbname = $dbname; $this->host = $host; $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); try{ $this->dbc = new PDO('mysql:host='.$this->host.';dbname='.$this->dbname.';charset=utf8', $user, $pass, $opt); } catch(PDOException $e){ echo $e->getMessage(); echo "There was a problem with connection to db check credenctials"; } } /*end function*/ public function backup_tables($tables = '*'){ /* backup the db OR just a table */ $host=$this->host; $user=$this->user; $pass=$this->pass; $dbname=$this->dbname; $data = ""; //get all of the tables if($tables == '*') { $tables = array(); $result = $this->dbc->prepare('SHOW TABLES'); $result->execute(); while($row = $result->fetch(PDO::FETCH_NUM)) { $tables[] = $row[0]; } } else { $tables = is_array($tables) ? $tables : explode(',',$tables); } //cycle through foreach($tables as $table) { $resultcount = $this->dbc->prepare('SELECT count(*) FROM '.$table); $resultcount->execute(); $num_fields = $resultcount->fetch(PDO::FETCH_NUM); $num_fields = $num_fields[0]; $result = $this->dbc->prepare('SELECT * FROM '.$table); $result->execute(); $data.= 'DROP TABLE '.$table.';'; $result2 = $this->dbc->prepare('SHOW CREATE TABLE '.$table); $result2->execute(); $row2 = $result2->fetch(PDO::FETCH_NUM); $data.= "\n\n".$row2[1].";\n\n"; for ($i = 0; $i < $num_fields; $i++) { while($row = $result->fetch(PDO::FETCH_NUM)) { $data.= 'INSERT INTO '.$table.' VALUES('; for($j=0; $j<$num_fields; $j++) { $row[$j] = addslashes($row[$j]); $row[$j] = str_replace("\n","\\n",$row[$j]); if (isset($row[$j])) { $data.= '"'.$row[$j].'"' ; } else { $data.= '""'; } if ($j<($num_fields-1)) { $data.= ','; } } $data.= ");\n"; } } $data.="\n\n\n"; } //save filename $filename = 'db-backup-'.time().'-'.(implode(",",$tables)).'.sql'; $this->writeUTF8filename($filename,$data); /*USE EXAMPLE $connection = new MySql(SERVERHOST,"your_db_name",DBUSER, DBPASS); $connection->backup_tables(); //OR backup_tables("posts"); $connection->closeConnection(); */ } /*end function*/ private function writeUTF8filename($filenamename,$content){ /* save as utf8 encoding */ $f=fopen($filenamename,"w+"); # Now UTF-8 - Add byte order mark fwrite($f, pack("CCC",0xef,0xbb,0xbf)); fwrite($f,$content); fclose($f); /*USE EXAMPLE this is only used by public function above... $this->writeUTF8filename($filename,$data); */ } /*end function*/ public function recoverDB($file_to_load){ echo "write some code to load and proccedd .sql file in here ..."; /*USE EXAMPLE this is only used by public function above... recoverDB("some_buck_up_file.sql"); */ } /*end function*/ public function closeConnection(){ $this->dbc = null; //EXAMPLE OF USE /*$connection->closeConnection();*/ }/*end function*/ } /*END OF CLASS*/ ?>
Теперь вы можете просто использовать это в своем файле backup.php:
include ('config.php'); include ('myclass.php'); $connection = new MySql(SERVERHOST,"your_databse_name_here",DBUSER, DBPASS); $connection->backup_tables(); /*Save all tables and it values in selected database*/ $connection->backup_tables("post_table"); /*Saves only table name posts_table from selected database*/ $connection->closeConnection();
Это означает, что посещение этой страницы приведет к резервному копированию вашего файла … конечно, это не обязательно должно быть так 🙂 вы можете называть этот метод для каждого сообщения в своей базе данных, чтобы быть в курсе все время, однако , Я бы рекомендовал писать его в один файл во все время вместо создания новых файлов со временем () … как он выше.
Надеюсь, это поможет и удачи! :>
Основываясь на хорошем решении, предоставленном tazo todua , я внес некоторые изменения, поскольку mysql_connect
устарел и не поддерживается в новой версии php. mysqli_connect
этого я использовал mysqli_connect
и увеличил производительность вставки значений в базу данных:
<?php /** * Updated: Mohammad M. AlBanna * Website: MBanna.info */ //MySQL server and database $dbhost = 'localhost'; $dbuser = 'my_user'; $dbpass = 'my_pwd'; $dbname = 'database_name'; $tables = '*'; //Call the core function backup_tables($dbhost, $dbuser, $dbpass, $dbname, $tables); //Core function function backup_tables($host, $user, $pass, $dbname, $tables = '*') { $link = mysqli_connect($host,$user,$pass, $dbname); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); exit; } mysqli_query($link, "SET NAMES 'utf8'"); //get all of the tables if($tables == '*') { $tables = array(); $result = mysqli_query($link, 'SHOW TABLES'); while($row = mysqli_fetch_row($result)) { $tables[] = $row[0]; } } else { $tables = is_array($tables) ? $tables : explode(',',$tables); } $return = ''; //cycle through foreach($tables as $table) { $result = mysqli_query($link, 'SELECT * FROM '.$table); $num_fields = mysqli_num_fields($result); $num_rows = mysqli_num_rows($result); $return.= 'DROP TABLE IF EXISTS '.$table.';'; $row2 = mysqli_fetch_row(mysqli_query($link, 'SHOW CREATE TABLE '.$table)); $return.= "\n\n".$row2[1].";\n\n"; $counter = 1; //Over tables for ($i = 0; $i < $num_fields; $i++) { //Over rows while($row = mysqli_fetch_row($result)) { if($counter == 1){ $return.= 'INSERT INTO '.$table.' VALUES('; } else{ $return.= '('; } //Over fields for($j=0; $j<$num_fields; $j++) { $row[$j] = addslashes($row[$j]); $row[$j] = str_replace("\n","\\n",$row[$j]); if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; } if ($j<($num_fields-1)) { $return.= ','; } } if($num_rows == $counter){ $return.= ");\n"; } else{ $return.= "),\n"; } ++$counter; } } $return.="\n\n\n"; } //save file $fileName = 'db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql'; $handle = fopen($fileName,'w+'); fwrite($handle,$return); if(fclose($handle)){ echo "Done, the file name is: ".$fileName; exit; } }
Я бы рекомендовал использовать mysqldump и из php использовать системную команду, как показано в найденной статье.
Вот php-файл, который позволит вам эффективно создавать / загружать резервную копию базы данных. Этот единственный файл с функциями безопасности на странице. только вам нужно загрузить это место в своей общей папке или папке проекта и вызвать его через браузер.
Загрузить URL-адрес: https://github.com/vkt005/php-mysql-db-backup
У меня также была ситуация, и я не мог найти инструмент, чтобы удовлетворить меня. Итак, ради резервного копирования / восстановления данных mysql с PHP я сделал программу, которая может сжимать данные в zip-файл, который вы можете скачать. Позже вы можете загружать и восстанавливать полную базу данных. Вы можете найти его на моей странице Github https://github.com/JoshyFrancis/mysql_backup_restore_php
Ответ @tazo todua выше
Хотя я уже проголосовал за вышеприведенный ответ, поскольку это было единственное работающее решение с «чистой» реализацией PHP, которое не создавало файлов длиной 0, и файлы выглядят нормально при первом взгляде, однако, обратите внимание, что это не удалось на некоторых FOREIGN KEYS, когда я пытался импортировать мою базу данных из файла резервной копии.
Решения на основе mysqldump
в PHP гораздо безопаснее использовать.
Решение для резервного копирования вашей базы данных в папке «dbBackup»
<?php error_reporting(E_ALL); /* Define database parameters here */ define("DB_USER", 'root'); define("DB_PASSWORD", ''); define("DB_NAME", 'YOUR_DATABASE _NAME'); define("DB_HOST", 'localhost'); define("OUTPUT_DIR", 'dbBackup'); // Folder / Directory Name define("TABLES", '*'); /* Instantiate Backup_Database and perform backup */ $backupDatabase = new Backup_Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); $status = $backupDatabase->backupTables(TABLES, OUTPUT_DIR) ? 'OK' : 'KO'; echo "Backup result: " . $status . " - By Irshad Khan"; /* The Backup_Database class */ class Backup_Database { /* Host where database is located */ var $host = 'localhost'; var $username = 'root'; var $passwd = ''; var $dbName = 'YOUR_DATABASE _NAME'; var $charset = ''; /* Constructor initializes database */ function Backup_Database($host, $username, $passwd, $dbName, $charset = 'utf8') { $this->host = $host; $this->username = $username; $this->passwd = $passwd; $this->dbName = $dbName; $this->charset = $charset; $this->initializeDatabase(); } protected function initializeDatabase() { $conn = @mysql_connect($this->host, $this->username, $this->passwd); // Ik Added @ to Hide PDO Error Message mysql_select_db($this->dbName, $conn); if (!mysql_set_charset($this->charset, $conn)) { mysql_query('SET NAMES ' . $this->charset); } } /* Backup the whole database or just some tables Use '*' for whole database or 'table1 table2 table3...' @param string $tables */ public function backupTables($tables = '*', $outputDir = '.') { try { /* Tables to export */ if ($tables == '*') { $tables = array(); $result = mysql_query('SHOW TABLES'); while ($row = mysql_fetch_row($result)) { $tables[] = $row[0]; } } else { $tables = is_array($tables) ? $tables : explode(',', $tables); } $sql = 'CREATE DATABASE IF NOT EXISTS ' . $this->dbName . ";\n\n"; $sql .= 'USE ' . $this->dbName . ";\n\n"; /* Iterate tables */ foreach ($tables as $table) { echo "Backing up " . $table . " table..."; $result = mysql_query('SELECT * FROM ' . $table); $numFields = mysql_num_fields($result); $sql .= 'DROP TABLE IF EXISTS ' . $table . ';'; $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE ' . $table)); $sql.= "\n\n" . $row2[1] . ";\n\n"; for ($i = 0; $i < $numFields; $i++) { while ($row = mysql_fetch_row($result)) { $sql .= 'INSERT INTO ' . $table . ' VALUES('; for ($j = 0; $j < $numFields; $j++) { $row[$j] = addslashes($row[$j]); // $row[$j] = ereg_replace("\n", "\\n", $row[$j]); if (isset($row[$j])) { $sql .= '"' . $row[$j] . '"'; } else { $sql.= '""'; } if ($j < ($numFields - 1)) { $sql .= ','; } } $sql.= ");\n"; } } $sql.="\n\n\n"; echo " OK <br/><br/>" . ""; } } catch (Exception $e) { var_dump($e->getMessage()); return false; } return $this->saveFile($sql, $outputDir); } /* Save SQL to file @param string $sql */ protected function saveFile(&$sql, $outputDir = '.') { if (!$sql) return false; try { $handle = fopen($outputDir . '/db-backup-' . $this->dbName . '-' . date("Ymd-His", time()) . '.sql', 'w+'); fwrite($handle, $sql); fclose($handle); } catch (Exception $e) { var_dump($e->getMessage()); return false; } return true; } } ?>
Хотя это старая нить, я не мог использовать ответы, размещенные здесь (Извините, что я плохой). Но вот сценарий, который я использую для резервного копирования баз данных MySQL,