Вот информация, которой я располагаю:
Я работаю с системой на базе Linux, использующей MySQL и PHP5. Мне нужно иметь возможность генерировать mysqldump из файла .php, а затем сохранять этот дамп в файл на сервере в указанном мной месте. Поскольку я не разбираюсь в PHP, я бы хотел, чтобы кто-нибудь помог мне, подсказал или написал код, который сделает то, что мне нужно. Это должно быть запущено и удаленно из интернета.
Ответ 1
Вы можете использовать функцию 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');
Конечно, от вас зависит использование правильной информации о подключении.
Ответ 2
Если вы хотите создать резервную копию, чтобы загрузить ее через браузер, вы также можете сделать это без использования файла. php-функция passthru() будет напрямую перенаправлять вывод mysqldump в браузер. В данном примере он также будет заархивирован.
Плюс: Вам не придется иметь дело с временными файлами.
Минус: Не работает в 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);
?>
Ответ 3
Посмотрите здесь: 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
);
Ответ 4
В целях безопасности рекомендуется указывать пароль в конфигурационном файле, а не в команде (пользователь может выполнить команду ps aux | grep mysqldump и увидеть пароль):
// создание временного файла
$file = tempnam(sys_get_temp_dir(), 'mysqldump');
// сохранение опций конфигурации
file_put_contents($file, "[mysqldump]
user={$user}
password=\"{$password}\"");
// выполнение команды и вывод результата
passthru("mysqldump --defaults-file=$file {$dbname}");
// удаление временного файла
unlink($file);
Ответ 5
Здесь вы найдете комплексное решение для дампа структуры и данных mysql, как в PMA (и без использования exec, passthru и т. д.):
https://github.com/antarasi/MySQL-Dump-with-Foreign-keys
Это форк проекта dszymczuk с моими улучшениями. Использование простое:
<?php
// параметры соединения MySQL
$dbhost = 'localhost';
$dbuser = 'dbuser';
$dbpsw = 'pass';
$dbname = 'dbname';
// соединение с сервером mysql
$connessione = @mysql_connect($dbhost,$dbuser,$dbpsw);
// установка кодировки
mysql_query("SET CHARSET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");
// подключение классов
require_once('FKMySQLDump.php');
//Создает новый экземпляр FKMySQLDump: он экспортирует без сжатия и файла base-16
$dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false);
$params = array(
//'skip_structure' => TRUE,
//'skip_data' => TRUE,
);
// создание дампа
$dumper->doFKDump($params);
?>
Ответ 6
Я нашел этот вариант, который следует подходу из предыдущего ответа и действительно работает.
$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}");
Ответ 7
Ни один из вышеперечисленных кодов не сработал для меня. Я использую 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 "Файл сохранен успешно";
}
} else {
echo "Ошибка – результат не определен";
}
Этот код сохранит файл в папке вашего проекта в соответствии с вашим запросом и любыми данными, которые вы запросите.
Web