Використання файлу .php для створення дампів MySQL


118

Ось інформація, яку я маю:

Я працюю з системою на базі Linux, використовуючи MySQL та PHP5. Мені потрібно мати змогу генерувати файл mysqldumpіз .php, а потім зберігати цей дамп у файлі на сервері в місці, яке я б вказав.

Оскільки я ноублет PHP, я хотів би, щоб хтось надав мені певну допомогу, вказівки або код, який би робив те, що мені потрібно. Це потрібно було б запустити віддалено від Інтернету.


2
Перевірте це . Я хотів би використовувати mysqldumpпо system().
Дейв


Цей допомагає створити mysqldump за допомогою файлу php. kvcodes.com/2017/10/10/php-create-mysql-backup
Kvvaradha

Не покладайтеся на 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
totalNotLizards

4
Ваш коментар, чудово, врятував мені життя. Зверніть увагу, що 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 до браузера. У цьому прикладі він також буде блискавкою.

Про: Вам не доведеться мати справу з тимчасовими файлами.

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);
?>

25

Погляньте тут: 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
);

2
Навіть на серверах, які мають execта / або shell_execвідключені безпекою, mysqldump-php чудово працює! Просто спробував це зараз на серверах Umbler і успішно отримав дамп. Дуже дякую за пораду!
giovannipds

це ідеально підходить для серверів, у яких також немає команд оболонки mysql!
Андрій

9

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

Примітка. Цей скрипт може містити помилки з NULL типами даних


Дякуємо, це зручний план B, якщо "shell_exec () відключений з міркувань безпеки" (там ви йдете, Google)
Deebster

1
Зауважте, що для цього використовується застарілі команди mysql замість mysqli.
Паскаль Рашик

"Помилки з 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);

?>

працює як шарм :-)


Це працює, але він дає інший вихід, ніж PHPMYADMIN mysqldump. Чому? Даних немає, тоді як резервна копія 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");

3

Відповідь майора Лео спрямовує мене в правильному напрямку, але це не спрацювало для мене. Я знайшов цей сайт, який дотримується того самого підходу, і працював.

$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
Matías Cánepa


0

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

Ви можете розширити команду будь-якими параметрами, що вимагає mysqldump. Використовуйте man mysqldumpдля додаткових варіантів (але я думаю, ви це знали;))



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

Жоден із перерахованих вище кодів не працював для мене. Я використовую 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";
    }

Це збереже файл у папці вашого проекту відповідно до вашого запиту, будь-які дані, які ви хочете.


Це рішення по суті є хибним, оскільки створює неправильні рядки SQL
Ваше

-1

Щоб скинути базу даних за допомогою shell_exec (), наведено нижче метод:

shell_exec('mysqldump -h localhost -u username -ppassword databasename  | gzip > dbname.sql.gz');

-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");


?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.