Задать вопрос
jessepinkman010101
@jessepinkman010101
Варю синий код

Как сделать бэкап базы данных mysql с помощью php?

Привет!
Мне нужно сделать бэкап, dump базы данных с помощью php.
Нагулил такое решение но ни одно не помогло:

//разумеется тут данные свои, имя пользователя, пароль и название бд
exec("mysqldump --user={$user} --password={$pass} --host={$host} {$database} --result-file={$dir} 2>&1", $output);


$backup_file = $dbname . date("Y-m-d-H-i-s") . '.gz';
   $command = "mysqldump --opt -h $dbhost -u $dbuser -p $dbpass ". "test_db | gzip > $backup_file";
   
   system($command);


exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');


Оно создает пустой файл .sql

Использую
SERVER - localhost(xampp)
PHP - php7.4
MYSQL - 10.4.19-MariaDB

Может кто-то уже делал такое, пожалуйста, поделитесь решением
  • Вопрос задан
  • 544 просмотра
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Для следует указать путь к исполняемому файлу:
$path = 'C:\path\to\mysqldump\';
exec("{$path}mysqldump --user={$user} --password={$pass} --host={$host} {$database} --result-file={$dir} 2>&1", $output);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@artem-dainov
Php, java, js. Boot spring, jquery, git
А если у автора путь поменяется, тогда что ему делать? В свое время, для себя, я писал скрипт, который делал бэкап базы, или таблицы, или всего сервера. Потратил на это два дня, но оно того стоило. Так что и вам рекомендую написать для себя такой же скрипт и будет тогда все ок. Логика проста. Вам нужно создать несколько функций. Одна будет подготавливать таблицу, другая будет подготавливать данные из таблицы, а третья соберет все это в один файл.
Ответ написан
Комментировать
Kalaganov5
@Kalaganov5
Реклама, Аналитика, Веб-разработка
Кому интересно, нашёл такое решение

<?php

/**
* Updated: Mohammad M. AlBanna
* Website: MBanna.info
*/

// MySQL server and database
$dbhost = 'localhost';
$dbuser = 'user';
$dbpass = 'pass';
$dbname = 'name';
$tables = '*';

// Call the core function
backup_tables($dbhost, $dbuser, $dbpass, $dbname, $tables);

// Core function
function backup_tables($host, $user, $pass, $dbname, $tables = '*') {
    $link = mysqli_connect($host, $user, $pass, $dbname);

    // Check connection
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
        exit;
    }

    mysqli_query($link, "SET NAMES 'utf8'");

    // Get all of the tables
    if ($tables == '*') {
        $tables = array();
        $result = mysqli_query($link, 'SHOW TABLES');
        while ($row = mysqli_fetch_row($result)) {
            $tables[] = $row[0];
        }
    } else {
        $tables = is_array($tables) ? $tables : explode(',', $tables);
    }

    $return = '';
    // Cycle through tables
    foreach ($tables as $table) {
        $result = mysqli_query($link, 'SELECT * FROM ' . $table);
        $num_fields = mysqli_num_fields($result);
        $num_rows = mysqli_num_rows($result);

        $return .= 'DROP TABLE IF EXISTS ' . $table . ';';
        $row2 = mysqli_fetch_row(mysqli_query($link, 'SHOW CREATE TABLE ' . $table));
        $return .= "\n\n" . $row2[1] . ";\n\n";
        $counter = 1;

        // Over tables
        for ($i = 0; $i < $num_fields; $i++) {
            // Over rows
            while ($row = mysqli_fetch_row($result)) {
                if ($counter == 1) {
                    $return .= 'INSERT INTO ' . $table . ' VALUES(';
                } else {
                    $return .= '(';
                }

                // Over fields
                for ($j = 0; $j < $num_fields; $j++) {
                    if (isset($row[$j])) {
                        $row[$j] = mysqli_real_escape_string($link, $row[$j]);
                        $row[$j] = str_replace("\n", "\\n", $row[$j]);
                        $return .= '"' . $row[$j] . '"';
                    } else {
                        $return .= '""';
                    }
                    if ($j < ($num_fields - 1)) {
                        $return .= ',';
                    }
                }

                if ($num_rows == $counter) {
                    $return .= ");\n";
                } else {
                    $return .= "),\n";
                }
                ++$counter;
            }
        }
        $return .= "\n\n\n";
    }

    // Save file
    $fileName = 'db-backup-' . time() . '-' . (md5(implode(',', $tables))) . '.sql';
    $handle = fopen($fileName, 'w+');
    fwrite($handle, $return);
    if (fclose($handle)) {
        echo "Done, the file name is: " . $fileName;
    } else {
        echo "Error writing to file.";
    }

    // Close the database connection
    mysqli_close($link);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы