4911


`mysqldump`を使えば一瞬ですが、`PHPMyAdmin`は`mysqldump`が無くても動くというので、裏側でどういった処理を行っているのでしょうか？PHPだけでどうやってSQLをダンプしているのか、気になります。

お恥ずかしいですが、ソース読んでも膨大すぎてさっぱりだったので、何方かご教示頂けたら幸いです。

ちなみに、「[WP Migrate DB](https://deliciousbrains.com/wp-migrate-db-
pro/)」というWordPressのプラグインがあるのですが、こちらも気になりますね。


CC BY-SA 3.0
2015-01-20T09:48:55.883
4908
2015-01-21T03:26:34.997
7526
question
php mysql phpmyadmin
PHPMyAdminはどうやってSQLをダンプしているのか


phpMyAdmin-4.3.7 のソースコードを眺めてみました。  
おそらく質問者様の言われている「ダンプ」と「mysqldump」の処理内容である「ダンプ」とは意味が異なるのではないかと思われます。以下は、phpMyAdmin
のメニューで **「Dump all rows」** を選んだ場合の処理です(単一のテーブルが対象)。  
コメントに書かれてある様に、「Dump all rows」、すなわち、`SELECT * FROM ...` としている様です。メニューに「Dump all
rows」ではなく「Select all rows」と書いてあれば、すぐに分かったのではないかと思いますが。。。

※ もちろん、これとは別に `mysqldump` コマンドを使用して複数のテーブルの内容をダンプする機能があります(EXPORT with SQL)。

`phpMyAdmin-4.3.7-all-languages/libraries/export.lib.php`

[code]

    function PMA_exportTable
               :
    // We export just one table
    // $allrows comes from the form when "Dump all rows" has been selected
    if (! isset($allrows)) {
        $allrows = '';
    }
    if (! isset($limit_to)) {
        $limit_to = 0;
    }
    if (! isset($limit_from)) {
        $limit_from = 0;
    }
    PMA_exportTable(
        $db, $table, $whatStrucOrData, $export_plugin, $crlf, $err_url,
        $export_type, $do_relation, $do_comments, $do_mime, $do_dates,
        $allrows, $limit_to, $limit_from, $sql_query, $aliases
    );
    
[/code]

`phpMyAdmin-4.3.7-all-languages/libraries/export.lib.php`

[code]

    function PMA_exportTable(
              :
        if (! empty($sql_query)) {
              :
        } else {
            $local_query  = 'SELECT * FROM ' . PMA_Util::backquote($db)
                . '.' . PMA_Util::backquote($table) . $add_query;
        }
    
[/code]


CC BY-SA 3.0
2015-01-20T12:06:34.270
4911
2015-01-20T12:06:34.270
4908
answer


phpMyAdmin
のダンプ機能がどうやって実装されているのか、結論から書きますと、SQL等を発行してデータベースの情報を取得し、独自にSQLとして出力していす。

phpMyAdmin のダンプ処理は `libraries/export.lib.php` 内の [`PMA_exportDatabase()`
関数](https://github.com/phpmyadmin/phpmyadmin/blob/master/libraries/export.lib.php#L529)あたりで行われているのでこちらから追っていけるかと思います。

# 重要なクラス

SQL ダンプの処理に深く関わっているクラスは以下の2つです。

  * ExportSql（[`libraries/plugins/export/ExportSql.class.php`](https://github.com/phpmyadmin/phpmyadmin/blob/master/libraries/plugins/export/ExportSql.class.php)）
  * PMA_DatabaseInterface（[`libraries/DatabaseInterface.class.php`](https://github.com/phpmyadmin/phpmyadmin/blob/master/libraries/DatabaseInterface.class.php)）

# 実際の処理

全てを書くことは出来ませんので大まかにどんな事が行われているのかを以下にいくつか紹介します。

## テーブル一覧

`SHOW TABLES FROM <DB名>` を発行して取得しています。

## CREATE [TABLE|VIEW] 文

`SHOW CREATE TABLE <テーブル名>` を発行してSQLを取得して生成。  
ただし、KEY節、CONSTRAINT節については、削除して、後で `ALTER TABLE` 文を発行。

## テーブルデータ

`SELECT * FROM <テーブル名>` を発行してデータ取得後、独自に INSERT 文を生成。

## CREATE TRIGGER 文

`SHOW TRIGGERS FROM <DB名>` か、 `information_schema.TRIGGERS` から SELECT
して取得した後、独自に `CREATE TRIGGER 文` を生成。


CC BY-SA 3.0
2015-01-21T03:26:34.997
4947
2015-01-21T03:26:34.997
2944
4908
answer