Использование файла.php для создания дампа MySQL
Вот информация, которую я имею:
Я работаю с системой на базе Linux, используя MySQL и PHP5. Я должен быть в состоянии генерировать mysqldump
из файла.php, а затем сохранить этот дамп в файле на сервере в месте, которое я бы указывал.
Поскольку я являюсь нублетом PHP, я бы хотел, чтобы кто-то дал мне некоторую помощь, руководство или код, который бы делал то, что мне нужно. Это должно быть запущено удаленно из Интернета.
16 ответов
Вы можете использовать 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("d-m-Y") . ".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.
Вы можете установить его с помощью composer, и это так же просто, как сделать:
<?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.
Из соображений безопасности рекомендуется указывать пароль в файле конфигурации, а не в команде (пользователь может выполнить 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);
Здесь вы можете найти комплексное решение для вывода структуры и данных 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);
?>
работает как шарм:-)
Пока вам разрешено использовать exec(), вы можете выполнять команды оболочки через ваш PHP-код.
Итак, если вы знаете, как написать mysqldump в командной строке, т.е.
mysqldump -u [username] -p [database] > [database].sql
тогда вы можете использовать это как параметр для функции exec().
exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
Ответ 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}");
Я надеюсь, что это помогает кому-то еще!
Ни один из приведенных выше кодов не работал для меня. Я использую Windows. Ниже код работал для меня...
$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
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;
<?php
exec('mysqldump --all-databases > /your/path/to/test.sql');
?>
Вы можете расширить команду с помощью любых параметров, которые mysqldump берет из курса. использование man mysqldump
для большего количества вариантов (но я думаю, что вы знали это;))
Вот еще одна нативная опция на основе PHP: https://github.com/2createStudio/shuttle-export
Ну, вы всегда можете использовать системный вызов PHP.
http://php.net/manual/en/function.system.php
http://www.php.net/manual/en/function.exec.php
Это запускает любую программу командной строки из PHP.
У меня тоже была ситуация, и я не мог найти инструмент, который бы работал на меня. Поэтому для резервного копирования и восстановления данных MYSQL из PHP я создал программу, которая может сжимать данные в zip-файл, который вы можете загрузить. Позже вы можете загрузить и восстановить полную базу данных. Вы можете найти его на моей странице Github
Для выгрузки базы данных с помощью shell_exec() ниже приведен метод:
shell_exec('mysqldump -h localhost -u username -ppassword databasename | gzip > dbname.sql.gz');
<?php
$toDay = date('d-m-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");
?>