Вот информация, которую я имею:
Я работаю с системой на базе Linux с использованием MySQL и PHP5. Мне нужно создать mysqldump
из .php-файла, а затем сохранить этот дамп в файле на сервере в том месте, которое я бы указал.
Поскольку я – nooblet PHP, я хотел бы, чтобы кто-то дал мне некоторую помощь, руководство или код, который будет делать то, что мне нужно. Это нужно было бы запустить удаленно из Интернета.
Вы можете использовать функцию exec()
для выполнения внешней команды.
Примечание: между shell_exec()
и exec()
я бы выбрал второй, который не возвращает результат в PHP-скрипт – не нужно, чтобы скрипт PHP получал весь SQL-дамп в виде строки: вам нужно только он записывается в файл, и это может быть сделано самой командой.
Эта внешняя команда будет:
mysqldump
, с правильными параметрами, Например :
mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql
Это означает, что ваш PHP-код будет выглядеть так:
exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');
Конечно, вам нужно использовать правильную информацию о соединении, заменив ее ...
Если вы хотите создать резервную копию для загрузки через браузер, вы также можете сделать это, не используя файл.
Функция php passthru () будет напрямую перенаправлять вывод mysqldump в браузер. В этом примере он также будет застегнут.
Pro: Вам не нужно иметь дело с временными файлами.
Con: Не работает в Windows. Может иметь ограничения с огромными наборами данных.
<?php $DBUSER="user"; $DBPASSWD="password"; $DATABASE="user_db"; $filename = "backup-" . date("dmY") . ".sql.gz"; $mime = "application/x-gzip"; header( "Content-Type: " . $mime ); header( 'Content-Disposition: attachment; filename="' . $filename . '"' ); $cmd = "mysqldump -u $DBUSER --password=$DBPASSWD $DATABASE | gzip --best"; passthru( $cmd ); exit(0); ?>
Посмотрите здесь: https://github.com/ifsnop/mysqldump-php ! Это собственное решение, написанное на php.
Вы можете установить его с помощью композитора, и это так же просто:
<?php use Ifsnop\Mysqldump as IMysqldump; try { $dump = new IMysqldump\Mysqldump('database', 'username', 'password'); $dump->start('storage/work/dump.sql'); } catch (\Exception $e) { echo 'mysqldump-php error: ' . $e->getMessage(); } ?>
Он поддерживает продвинутых пользователей, с большим количеством опций, скопированных с исходного mysqldump.
Все параметры описаны на странице github, но более или менее являются авто-пояснительными:
$dumpSettingsDefault = array( 'include-tables' => array(), 'exclude-tables' => array(), 'compress' => 'None', 'no-data' => false, 'add-drop-database' => false, 'add-drop-table' => false, 'single-transaction' => true, 'lock-tables' => false, 'add-locks' => true, 'extended-insert' => true, 'disable-foreign-keys-check' => false, 'where' => '', 'no-create-info' => false );
Повторите следующую ссылку, которая содержит скриптлет, который поможет вам: http://davidwalsh.name/backup-mysql-database-php
Примечание. Этот скрипт может содержать ошибки с NULL-типами данных
До тех пор, пока вам разрешено использовать exec () , вы можете выполнять команды оболочки через ваш PHP-код.
Предположим, вы знаете, как написать mysqldump в командной строке, т.е.
mysqldump -u [username] -p [database] > [database].sql
то вы можете использовать это как параметр для функции exec ().
exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
Здесь вы можете найти комплексное решение для dump структуры и данных mysql, таких как PMA (и без использования exec, passthru и т. Д.):
https://github.com/antarasi/MySQL-Dump-with-Foreign-keys
Это вилка проекта dszymczuk с моими улучшениями.
Простое использование
<?php //MySQL connection parameters $dbhost = 'localhost'; $dbuser = 'dbuser'; $dbpsw = 'pass'; $dbname = 'dbname'; //Connects to mysql server $connessione = @mysql_connect($dbhost,$dbuser,$dbpsw); //Set encoding mysql_query("SET CHARSET utf8"); mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); //Includes class require_once('FKMySQLDump.php'); //Creates a new instance of FKMySQLDump: it exports without compress and base-16 file $dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false); $params = array( //'skip_structure' => TRUE, //'skip_data' => TRUE, ); //Make dump $dumper->doFKDump($params); ?>
работает как шарм 🙂
По соображениям безопасности рекомендуется указывать пароль в файле конфигурации, а не в команде (пользователь может выполнить ps aux | grep mysqldump
и посмотреть пароль).
//create a temporary file $file = tempnam(sys_get_temp_dir(), 'mysqldump'); //store the configuration options file_put_contents($file, "[mysqldump] user={$user} password=\"{$password}\""); //execute the command and output the result passthru("mysqldump --defaults-file=$file {$dbname}"); //delete the temporary file unlink($file);
Ответ MajorLeo указывает мне в правильном направлении, но это не сработало для меня. Я нашел этот сайт, который следует тому же подходу и действительно работал.
$dir = "path/to/file/"; $filename = "backup" . date("YmdHis") . ".sql.gz"; $db_host = "host"; $db_username = "username"; $db_password = "password"; $db_database = "database"; $cmd = "mysqldump -h {$db_host} -u {$db_username} --password={$db_password} {$db_database} | gzip > {$dir}{$filename}"; exec($cmd); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"$filename\""); passthru("cat {$dir}{$filename}");
Надеюсь, это поможет кому-то еще!
Ну, вы всегда можете использовать вызов системной функции PHP.
http://php.net/manual/en/function.system.php
http://www.php.net/manual/en/function.exec.php
Это запускает любую программу из командной строки из PHP.
<?php exec('mysqldump --all-databases > /your/path/to/test.sql'); ?>
Вы можете расширить эту команду с помощью любых вариантов mysqldump. Используйте man mysqldump
для получения дополнительных параметров (но я думаю, вы знали это;))
Вот еще один собственный PHP-вариант: https://github.com/2createStudio/shuttle-export
Чтобы сбрасывать базу данных с помощью shell_exec (), ниже приведен метод:
shell_exec('mysqldump -h localhost -u username -ppassword databasename | gzip > dbname.sql.gz');
global $wpdb; $export_posts = $wpdb->prefix . 'export_posts'; $backupFile = $_GET['targetDir'].'export-gallery.sql'; $dbhost=DB_HOST; $dbuser=DB_USER; $dbpass=DB_PASSWORD; $db=DB_NAME; $path_to_mysqldump = "D:\xampp_5.6\mysql\bin"; $query= "D:\\xampp_5.6\mysql\bin\mysqldump.exe -u$dbuser -p$dbpass $db $export_posts> $backupFile"; exec($query); echo $query;
Ни один из приведенных выше кодов не работал для меня. Я использую окна. Код ниже работал для меня …
$sql = "SELECT * FROM $tableName WHERE yourclause"; $result = $conn->query($sql); if($result){ if ($result->num_rows > 0) { $myfile = fopen("daily_events_$district.sql", "w") or die("Unable to open file!"); while($row = $result->fetch_assoc()) { $rowToString = implode("','",$row); $writeToFile = "INSERT INTO $tableName VALUES('$rowToString');". PHP_EOL; fwrite($myfile,$writeToFile); } echo "File saved successfully"; } } else { echo "No result found"; }
Это сохранит файл в папке проекта в соответствии с вашим запросом независимо от того, какие данные вы хотите. Если вы хотите сбросить всю базу данных или таблицу, вы можете использовать эту ссылку http://www.php-mysql-tutorial.com/wikis/mysql-tutorials/using-php-to-backup-mysql-databases.aspx
<?php $toDay = date('dm-Y'); $dbhost = "localhost"; $dbuser = "YOUR DB USER"; $dbpass = "USER PASSWORD"; $dbname = "DB NAME"; exec("mysqldump --user=$dbuser --password='$dbpass' --host=$dbhost $dbname > /home/....../public_html/".$toDay."_DB.sql"); ?>
У меня также была ситуация, и я не мог найти инструмент для работы для меня. Поэтому для создания резервной копии и восстановления MYSQL-данных с PHP я создал программу, которая может сжимать данные в zip-файл, который вы можете загрузить. Позже вы можете загрузить и восстановить полную базу данных. Вы можете найти его на моей странице Github