Sử dụng tệp .php để tạo kết xuất MySQL


118

Đây là thông tin tôi có:

Tôi đang làm việc với hệ thống dựa trên Linux sử dụng MySQL và PHP5. Tôi cần có khả năng tạo mysqldumptệp từ bên trong tệp .php, sau đó lưu tệp kết xuất đó trong tệp trên máy chủ ở vị trí mà tôi sẽ chỉ định.

Vì tôi là một nooblet PHP, tôi muốn ai đó cung cấp cho tôi một số hỗ trợ, hướng dẫn hoặc mã để làm những gì tôi yêu cầu. Điều này sẽ phải được chạy từ xa từ Internet.


2
Kiểm tra cái này . Tôi sẽ sử dụng mysqldumpbởi system().
dave


Điều này giúp tạo mysqldump với tệp php trợ giúp. kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

Không dựa vào thi hành () hoặc hệ thống (), vì hầu hết các trường hợp chúng bị vô hiệu hóa trên các máy chủ được chia sẻ. Answer nên thực hiện một cách thích hợp để tạo kết xuất cơ sở dữ liệu mà không cần chạy các chương trình bên ngoài.
diego

Câu trả lời:


159

Bạn có thể sử dụng exec()hàm để thực hiện một lệnh bên ngoài.

Lưu ý: giữa shell_exec()exec(), tôi sẽ chọn cái thứ hai, không trả về đầu ra cho tập lệnh PHP - không cần tập lệnh PHP để nhận toàn bộ kết xuất SQL dưới dạng một chuỗi: bạn chỉ cần nó được ghi vào một tệp, và điều này có thể được thực hiện bằng chính lệnh.


Lệnh bên ngoài đó sẽ:

  • là một cuộc gọi đến mysqldump, với các thông số phù hợp,
  • và chuyển hướng đầu ra thành một tệp.

Ví dụ :

mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql


Có nghĩa là mã PHP của bạn sẽ giống như sau:

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


Tất nhiên, tùy thuộc vào bạn để sử dụng thông tin kết nối phù hợp, thay thế ...bằng những thông tin đó.


2
Tôi sẽ xem xét điều này ngay. Có cách nào để tạo đầu ra trên trang PHP khi nó đã hoàn thành thông báo "Dump hoàn tất!" hay gì đó?
Thomas Ward,

6
exec()sẽ không trở lại cho đến khi lệnh kết thúc; như vậy, chỉ cần đặt một số echo "dump complete"sau khi gọiexec()
Pascal MARTIN

7
Điều này đã giúp tôi ngày hôm nay - và một lưu ý cho người dùng của sư tử OSX: mysqldump shortcut chưa được thiết lập cho tôi khi tôi cài đặt mysql, vì vậy tôi đã tìm thấy nó - đây là con đường:/usr/local/mysql/bin/mysqldump
totallyNotLizards

4
Bình luận của bạn, jammypeach, đã cứu mạng tôi. Hãy lưu ý rằng any1 có thể cần bổ sung nhỏ này: '/ usr / local / mysql / bin / mysqldump -u ...'
helpse

1
Lưu ý cho người dùng Windows: Trong Windows, bạn phải chỉ định đường dẫn đầy đủ đến mysqldump.exe, ví dụ:exec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama

83

Nếu bạn muốn tạo bản sao lưu để tải xuống qua trình duyệt, bạn cũng có thể thực hiện việc này mà không cần sử dụng tệp.

Hàm php passthru () sẽ chuyển hướng trực tiếp đầu ra của mysqldump đến trình duyệt. Trong ví dụ này, nó cũng sẽ được nén.

Chuyên nghiệp: Bạn không phải xử lý các tệp tạm thời.

Con: Sẽ không hoạt động trên Windows. Có thể có giới hạn với bộ dữ liệu lớn.

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

Hãy xem tại đây: https://github.com/ifsnop/mysqldump-php ! Nó là một giải pháp gốc được viết bằng php.

Bạn có thể cài đặt nó bằng cách sử dụng trình soạn nhạc và nó dễ dàng như thực hiện:

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

?>

Nó hỗ trợ người dùng nâng cao, với rất nhiều tùy chọn được sao chép từ mysqldump gốc.

Tất cả các tùy chọn đều được giải thích tại trang github, nhưng ít nhiều đều được tự động giải thích:

$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
Ngay cả trên các máy chủ có execvà / hoặc shell_execbị vô hiệu hóa bởi bảo mật, mysqldump-php vẫn hoạt động tốt! Chỉ cần thử nó ngay bây giờ trên máy chủ của Umbler và kết xuất thành công. Cảm ơn bạn rất nhiều về mẹo này!
giovannipds

điều này là hoàn hảo cho các máy chủ không có sẵn lệnh shell mysql!
Andrej

9

Vui lòng cung cấp đến liên kết sau có chứa script sẽ giúp bạn: http://davidwalsh.name/backup-mysql-database-php

Lưu ý: Tập lệnh này có thể chứa lỗi với kiểu dữ liệu NULL


Cảm ơn, đây là một kế hoạch B nếu tiện dụng "shell_exec () đã bị vô hiệu vì lý do an ninh" (có bạn đi, Google)
Deebster

1
Lưu ý rằng điều này sử dụng các lệnh mysql không dùng nữa thay vì mysqli.
Pascal Raszyk

"Lỗi với kiểu dữ liệu NULL" có vẻ là một vấn đề đối với giải pháp sao lưu.
alexis

7

Vì lý do bảo mật, bạn nên chỉ định mật khẩu trong tệp cấu hình chứ không phải trong lệnh (người dùng có thể thực thi a ps aux | grep mysqldumpvà xem mật khẩu).

//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

Tại đây, bạn có thể tìm thấy một giải pháp toàn diện để kết xuất cấu trúc và dữ liệu mysql như trong PMA (và không sử dụng thực thi, passthru, v.v.):

https://github.com/antarasi/MySQL-Dump-with-Foreign-keys

Nó là nhánh của dự án dszymczuk với những cải tiến của tôi.

Cách sử dụng rất đơn giản

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

?>

hoạt động như một sự quyến rũ :-)


Nó hoạt động - nhưng nó tạo ra một đầu ra khác với mysqldump PHPMYADMIN. Tại sao ? Thiếu dữ liệu trong khi sao lưu PHPMYADMIN của tôi đã hoàn tất.
ledawg

@ Ledew-de: Dữ liệu không nên được đưa vào bãi chỉ nếu tùy chọn skip_data => đúng được truyền như một tham số
ANTARA

3

Miễn là bạn được phép sử dụng execute () , bạn có thể thực thi các lệnh shell thông qua mã PHP của mình.

Vì vậy, giả sử bạn biết cách viết mysqldump trong dòng lệnh, tức là

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

thì bạn có thể sử dụng nó làm tham số cho hàm execute ().

exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");

3

Câu trả lời của MajorLeo chỉ cho tôi đi đúng hướng nhưng nó không hiệu quả với tôi. Tôi đã tìm thấy trang web này theo cùng một cách tiếp cận và đã hoạt động.

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

Tôi hy vọng nó sẽ giúp ai đó khác!


Của bạn ở đây trả lại kết quả đầu ra cho người dùng cuối phải không? IE khi thực thi nó sẽ xuất ra theo cách bạn có thể sao chép / dán? Nếu vậy thì điều này sẽ không đạt được những gì câu trả lời được chấp nhận đã làm - chỉ cần tạo tệp trên máy chủ để tôi có thể lấy nó bằng scp.
Thomas Ward

@ThomasW. Mã này thực hiện hai việc: nó tạo một tệp được lưu trên máy chủ và nhắc hộp thoại tải xuống. Nếu bạn chỉ muốn lưu trữ tệp, thì đừng thực hiện phần header () và passthru (). Và nếu bạn cần chỉ là vị trí tập tin, bạn luôn có thể echo $ dir & $ biến filename .... Không có vấn đề gì bạn chọn, bạn vẫn có thể truy cập các tập tin thông qua SCP
Matías Canepa


0

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

Bạn có thể mở rộng lệnh với bất kỳ tùy chọn nào mà mysqldump thực hiện. Sử dụng man mysqldumpcho nhiều tùy chọn hơn (nhưng tôi đoán bạn biết điều đó;))



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

Không có mã nào ở trên phù hợp với tôi. Tôi đang sử dụng cửa sổ. Dưới đây Mã đã làm việc cho tôi ...

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

Thao tác này sẽ lưu tệp trong thư mục dự án của bạn theo truy vấn của bạn bất kỳ dữ liệu nào bạn muốn.


Giải pháp này về cơ bản là thiếu sót, vì nó tạo ra các chuỗi SQL không chính xác
Common Sense của bạn

-1

Để kết xuất cơ sở dữ liệu bằng cách sử dụng shell_exec (), dưới đây là phương pháp:

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


?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.