Web

Использование файла .php для создания дампа MySQL

Вот информация, которой я располагаю:

Я работаю с системой на базе 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

Как заставить PHP перестать заменять символы «.» в массивах $_GET или $_POST

Web

Проблемы при загрузке нескольких изображений с получением имени папки в базе данных

Web

PHP – статические свойства

Что такое Флаттер от Google, как им пользоваться и зачем он создан?
Web

Что такое Флаттер от Google, как им пользоваться и зачем он создан?