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

118

Вот информация, которая у меня есть:

Я работаю с системой на базе Linux с использованием MySQL и PHP5. Мне нужно создать mysqldumpфайл из файла .php, а затем сохранить этот дамп в файле на сервере в указанном мной месте.

Поскольку я новичок в PHP, мне бы хотелось, чтобы кто-нибудь дал мне некоторую помощь, руководство или код, который бы делал то, что мне нужно. Это должно быть запущено удаленно из Интернета.

Томас Уорд
источник
2
Проверить это . Я бы использовал mysqldumpby system().
Дэйв
Это помогает создать mysqldump с помощью файла php. kvcodes.com/2017/10/php-create-mysql-backup
Квварадха
Не полагайтесь на exec () или system (), потому что в большинстве случаев они отключены на общих хостингах. Ответ должен реализовывать правильный способ создания дампа базы данных без запуска внешних программ.
диего

Ответы:

159

Вы можете использовать эту 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, когда она закончила говорить «Дамп завершен!» или что-то?
Thomas Ward
6
exec()не вернется, пока команда не будет завершена; так что просто положите немного echo "dump complete"после звонкаexec()
Паскаль МАРТИН
7
Это помогло мне сегодня - и примечание для пользователей osx lion: ярлык mysqldump не был настроен для меня, когда я установил mysql, поэтому мне пришлось его найти - вот путь:/usr/local/mysql/bin/mysqldump
полностьюNotLizards
4
Ваш комментарий, jammypeach, спас мне жизнь. Обратите внимание, что any1 может потребоваться это небольшое дополнение: '/ usr / local / mysql / bin / mysqldump -u ...'
helpse
1
Примечание для пользователей Windows: в Windows необходимо указать полный путь к mysqldump.exe, напримерexec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama
83

Если вы хотите создать резервную копию, чтобы загрузить ее через браузер, вы также можете сделать это без использования файла.

Функция php passthru () будет напрямую перенаправлять вывод mysqldump в браузер. В этом примере он также будет заархивирован.

Pro: вам не нужно иметь дело с временными файлами.

Против: не работает в 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);
?>
MajorLeo
источник
25

Взгляните сюда: 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
);
диего
источник
2
Даже на серверах, которые имеют execи / или shell_execотключены системой безопасности, mysqldump-php отлично работает! Просто попробовал прямо сейчас на серверах Umbler и успешно получил дамп. Большое спасибо за подсказку!
giovannipds
это идеально подходит для серверов, на которых также нет команд оболочки mysql!
Андрей
9

Перейдите по следующей ссылке, которая содержит сценарий, который поможет вам: http://davidwalsh.name/backup-mysql-database-php

Примечание. Этот сценарий может содержать ошибки с типами данных NULL.

Андре Пуэль
источник
Спасибо, это удобный план Б, если «shell_exec () отключен по соображениям безопасности» (вот и все, Google)
Deebster
1
Обратите внимание, что здесь используются устаревшие команды mysql вместо mysqli.
Паскаль Рашик 09
«Ошибки с типами данных NULL» звучат как проблема для резервного решения.
Alexis
7

По соображениям безопасности рекомендуется указывать пароль в файле конфигурации, а не в команде (пользователь может выполнить a 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);
Константин Гальбену
источник
5

Здесь вы можете найти комплексное решение для дампа структуры и данных 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);

?>

работает как шарм :-)

АНТАРА
источник
Он работает, но выводит другой результат, чем mysqldump PHPMYADMIN. Зачем ? Данные отсутствуют, а моя резервная копия PHPMYADMIN завершена.
ledawg
@ Ledew-de: Данные не должны быть включены в дамп, только если в качестве параметра передана опция skip_data => true
ANTARA
3

Пока вам разрешено использовать exec () , вы можете выполнять команды оболочки через свой PHP-код.

Итак, если вы знаете, как написать mysqldump в командной строке, т.е.

mysqldump -u [username] -p [database] > [database].sql

тогда вы можете использовать это как параметр функции exec ().

exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
charliefortune
источник
3

Ответ 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}");

Надеюсь, это поможет кому-то другому!

Матиас Канепа
источник
Ваш здесь возвращает результат конечному пользователю, не так ли? IE при выполнении выводит его таким образом, чтобы вы могли скопировать / вставить? Если это так, то это не приведет к тому, что сделал принятый ответ - просто создаст файл на сервере, чтобы я мог получить его с помощью scp.
Томас Уорд,
@ThomasW. Этот код выполняет две функции: создает файл, сохраненный на сервере, и запрашивает диалоговое окно загрузки. Если вы просто хотите сохранить файл, не выполняйте части header () и passthru (). И если вам нужно только расположение файла, вы всегда можете повторить переменные $ dir и $ filename .... Независимо от того, что вы выберете, вы все равно можете получить доступ к файлу через SCP
Матиас Канепа,
0

<?php exec('mysqldump --all-databases > /your/path/to/test.sql'); ?>

Вы можете расширить команду любыми параметрами, которые, конечно, принимает mysqldump. Используйте man mysqldumpдля дополнительных опций (но я думаю, вы это знали;))

Rem.co
источник
0

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;

Фуад Хасан
источник
0

Ни один из приведенных выше кодов не помог мне. Я использую окна. Ниже код работал у меня ...

$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";
    }

Это сохранит файл в папке вашего проекта в соответствии с вашим запросом, какие данные вам нужны.

Сварним Диксит
источник
Это решение по сути ошибочно, так как оно создает неверные строки SQL
Ваш здравый смысл
-1

Чтобы сбросить базу данных с помощью shell_exec (), ниже приведен метод:

shell_exec('mysqldump -h localhost -u username -ppassword databasename  | gzip > dbname.sql.gz');
Digisha
источник
-2
<?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");


?>
PradeepJangid
источник