filippoangileri / mysqldump-php
MySQL自带mysqldump命令行的PHP版本
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.8.36
- squizlabs/php_codesniffer: 1.*
This package is auto-updated.
Last update: 2024-09-11 09:29:51 UTC
README
要求 | 安装 | 入门 | API | 设置 | PDO 设置 | 待办事项 | 许可 | 鸣谢
这是一个MySQL自带的mysqldump命令行的PHP版本,无需依赖,输出压缩,并提供了合理的默认设置。
MySQLDump-PHP支持备份表结构、数据本身、视图、触发器和事件。
MySQLDump-PHP是唯一支持以下功能的库
- 以十六进制形式输出二进制大对象。
- 解析视图依赖关系(使用替代表)。
- 输出与原始mysqldump进行比较。链接到travis-ci测试系统(从php 5.3到7.3 & hhvm进行测试)
- 输出存储过程(函数和过程)。
- 输出事件。
- 执行扩展插入和/或完整插入。
- 支持MySQL 5.7的虚拟列。
- 在插入时忽略错误,如果存在重复键,则忽略错误。
- 在导出时动态修改数据库中的数据,使用挂钩。
- 可以直接保存到Google Cloud Storage,通过压缩流包装器(GZIPSTREAM)。
- 如果没有可用的mysql可执行文件,可以从文件恢复备份。
重要
从版本2.0开始,数据库连接使用标准的DSN,详细说明见 PDO连接字符串。
要求
- PHP 5.3.0或更高版本
- MySQL 4.1.0或更高版本
- PDO
安装
使用 Composer
$ composer require filippoangileri/mysqldump-php
使用 Curl 始终下载并解压最新版本
$ curl --silent --location https://api.github.com/repos/ifsnop/mysqldump-php/releases | grep -i tarball_url | head -n 1 | cut -d '"' -f 4 | xargs curl --location --silent | tar xvz
入门
<?php use Ifsnop\Mysqldump as IMysqldump; try { $dump = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password'); $dump->start('storage/work/dump.sql'); } catch (\Exception $e) { echo 'mysqldump-php error: ' . $e->getMessage(); }
简单的PHP
<?php include_once(dirname(__FILE__) . '/mysqldump-php-2.0.0/src/Ifsnop/Mysqldump/Mysqldump.php'); $dump = new Ifsnop\Mysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password'); $dump->start('storage/work/dump.sql');
参考 wiki 以获取一些示例和mysqldump与mysqldump-php备份的比较。
导出时更改值
您可以注册一个可调用的函数,在导出过程中将用于转换值。一个示例用例是从数据库备份中删除敏感数据。
$dumper = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password'); $dumper->setTransformTableRowHook(function ($tableName, array $row) { if ($tableName === 'customers') { $row['social_security_number'] = (string) rand(1000000, 9999999); } return $row; }); $dumper->start('storage/work/dump.sql');
获取备份信息
您可以注册一个可调用的函数,在导出过程中将用于报告进度。
$dumper->setInfoHook(function($object, $info) { if ($object === 'table') { echo $info['name'], $info['rowCount']; });
表特定导出条件
您可以注册针对特定表的 'where' 子句,以限制每个表的数据。这些将覆盖默认的 where
导出设置
$dumper = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password'); $dumper->setTableWheres(array( 'users' => 'date_registered > NOW() - INTERVAL 3 MONTH AND deleted=0', 'logs' => 'date_logged > NOW() - INTERVAL 1 DAY', 'posts' => 'isLive=1' ));
表特定导出限制
您可以注册针对特定表的 'limits',以限制每个表的返回行数
$dumper = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password'); $dumper->setTableLimits(array( 'users' => 300, 'logs' => 50, 'posts' => 10 ));
构造函数和默认参数
/** * Constructor of Mysqldump. Note that in the case of an SQLite database * connection, the filename must be in the $db parameter. * * @param string $dsn PDO DSN connection string * @param string $user SQL account username * @param string $pass SQL account password * @param array $dumpSettings SQL database settings * @param array $pdoSettings PDO configured attributes */ public function __construct( $dsn = '', $user = '', $pass = '', $dumpSettings = array(), $pdoSettings = array() ) $dumpSettingsDefault = array( 'include-tables' => array(), 'exclude-tables' => array(), 'compress' => Mysqldump::NONE, 'init_commands' => array(), 'no-data' => array(), 'if-not-exists' => false, 'reset-auto-increment' => false, 'add-drop-database' => false, 'add-drop-table' => false, 'add-drop-trigger' => true, 'add-locks' => true, 'complete-insert' => false, 'databases' => false, 'default-character-set' => Mysqldump::UTF8, 'disable-keys' => true, 'extended-insert' => true, 'events' => false, 'hex-blob' => true, /* faster than escaped content */ 'insert-ignore' => false, 'net_buffer_length' => self::MAXLINESIZE, 'no-autocommit' => true, 'no-create-db' => false, 'no-create-info' => false, 'lock-tables' => true, 'replace' => false, 'routines' => false, 'single-transaction' => true, 'skip-triggers' => false, 'skip-tz-utc' => false, 'skip-comments' => false, 'skip-dump-date' => false, 'skip-definer' => false, 'where' => '', /* deprecated */ 'disable-foreign-keys-check' => true ); $pdoSettingsDefaults = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false ); // missing settings in constructor will be replaced by default options $this->_pdoSettings = self::array_replace_recursive($pdoSettingsDefault, $pdoSettings); $this->_dumpSettings = self::array_replace_recursive($dumpSettingsDefault, $dumpSettings);
导出设置
- include-tables
- 仅包括这些表(表名数组),如果为空则包括所有表。
- exclude-tables
- 排除这些表(表名数组),如果为空则包含所有表,支持正则表达式。
- include-views
- 仅包含这些视图(视图名数组),如果为空则包含所有视图。默认情况下,所有与include-tables数组中表名相同的视图都将被包含。
- if-not-exists
- 仅在不存在同名表时创建新表。如果表已存在,则不会抛出错误信息。
- compress
- Gzip,Bzip2,None。
- 可以使用声明的常量指定:IMysqldump\Mysqldump::GZIP,IMysqldump\Mysqldump::BZIP2 或 IMysqldump\Mysqldump::NONE
- reset-auto-increment
- 从数据库定义中移除AUTO_INCREMENT选项
- 当与no-data一起使用时很有用,因此当数据库重新创建时,它将从1开始而不是使用旧值
- add-drop-database
- add-drop-table
- add-drop-triggers
- add-locks
- complete-insert
- databases
- default-character-set
- utf8(默认,兼容选项),utf8mb4(用于完全符合utf8)
- 可以使用声明的常量指定:IMysqldump\Mysqldump::UTF8 或 IMysqldump\Mysqldump::UTF8MB4BZIP2
- https://dev.mysqlserver.cn/doc/refman/5.5/en/charset-unicode-utf8mb4.html
- https://mathiasbynens.be/notes/mysql-utf8mb4
- disable-keys
- events
- extended-insert
- hex-blob
- insert-ignore
- lock-tables
- net_buffer_length
- no-autocommit
- 禁用autocommit的选项(更快地插入,无索引键问题)
- https://dev.mysqlserver.cn/doc/refman/4.1/en/commit.html
- no-create-db
- no-create-info
- no-data
- https://dev.mysqlserver.cn/doc/refman/5.1/en/mysqldump.html#option_mysqldump_no-data
- 不要为这些表(表名数组)导出数据,支持正则表达式,
true
表示忽略所有表
- replace
- 使用REPLACE INTO语句而不是INSERT进行导出。注意,IGNORE选项被静默忽略。
- routines
- single-transaction
- skip-comments
- skip-dump-date
- skip-triggers
- skip-tz-utc
- skip-definer
- where
以下选项现在是默认启用的,并且无法禁用它们,因为它们应该始终使用。
- disable-foreign-keys-check
PDO设置
- PDO::ATTR_PERSISTENT
- PDO::ATTR_ERRMODE
- PDO::MYSQL_ATTR_INIT_COMMAND
- PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
错误
要转储数据库,您需要以下权限
- SELECT
- 为了转储表结构和数据。
- SHOW VIEW
- 如果任何数据库有视图,否则您将收到错误。
- TRIGGER
- 如果任何表有一个或多个触发器。
- LOCK TABLES
- 如果启用了“锁定表”选项。
使用 SHOW GRANTS FOR user@host; 来了解用户拥有的权限。有关更多信息,请参阅以下链接
测试
当前用于测试的代码是一个丑陋的修补程序。可能还有许多更好的方式使用PHPUnit来完成,所以欢迎提交PR。测试脚本会创建并使用所有可能的数据类型填充数据库。然后它使用mysqldump-php和mysqldump导出数据库,并比较输出。只有当它们完全相同,测试才通过。在这次提交之后,一些测试开始使用phpunit执行。
如果MySQL服务器不支持某些测试,则跳过一些测试。
有几项测试仅比较原始SQL代码和mysqldump-php生成的SQL代码,因为mysqldump中不可用一些选项。
错误(来自mysqldump,而不是mysqldump-php)
在这个错误报告之后,引入了一个新的错误。即使使用hex-blob选项,如果值是空的,也会附加_binary。
回滚
mysqldump-php不与php 5.2向后兼容,因为我们使用了命名空间。但是,如果需要,它可以轻易地修复。
待办事项
编写更多测试,也测试mariadb。
贡献
将所有代码格式化为PHP-FIG标准。 https://www.php-fig.org/
许可
本项目是开源软件,许可协议为GPL许可
致谢
经过8年多,原始源代码中几乎没有什么剩下,但
最初基于2009年James Elliott的脚本。 https://code.google.com/archive/p/db-mysqldump/
由Michael J. Calkins修改和扩展。 https://github.com/clouddueling
目前由Diego Torres维护、开发和改进。 https://github.com/ifsnop