php - 导出和导入数据库

标签 php mysql database mysqli import

我在 iPage 上有一台服务器,我正在尝试找到一种方法来正确备份我的数据库。 iPage 使我们可以选择将所有表一次性备份到一个文件中,或者将其逐个备份到单独的文件中。但问题是,我的表中有很多行,并且许多表经常超过每个文件 10.24 MB 的导入限制,更不用说我在 iPage 上的计划的最大查询限制为每小时 150,000 次查询。这意味着,即使在那一小时内没有人访问我的网站,并且以这种方式耗尽查询,如果备份文件超过 150,000 行,导入也会在中间中断。

我知道这个问题肯定有点模糊,但我在这里想问的是关于我应该做什么的建议,在这种情况下,以一种我可以导入整个文件的方式成功备份我的文件如果可能的话,数据库会成功地在中间不被中断。任何有关备份数据库的其他建议也值得赞赏。

最佳答案

我会创建增量备份。每个具有重要大小的表,或者只是全部表,都将包含名为

的列
dtUpdated datetime not null

不要让名称暗示只是为了更新。相反,在任何插入或更新时都会将其设置为 now()

关键表中的auto_increment id 当然有助于增量备份。我不确定我是否想在没有这样的情况下尝试它(尽管,这是没有必要的)。对于下面的内容,我假设 auto_increment id 已就位。

要准备好并开始运行,请首先让系统离线以接收任何新条目。

使用 alter table 添加任何缺失的列,例如上述两列。

将包含该列的所有行dtUpdated设置为类似的内容

'2015-12-06 00:00:00' 

其中包括时间部分。请注意,对于启动部分来说,now() 根本不是一个好的选择。

还有另一个表,可以小到 1 行 1 列,其中 datetime 表示上次备份的 datetime。我们将此表称为 LastBackup。在您下次备份之前,这不会改变。

最初设置此值,如上所述。

修改您的代码,以便任何插入或更新都可以使用 now() 使 dtUpdated 中的条目保持最新

增量备份会更小,很可能是这样,只从表中选取 dtUpdated 位于表 LastBackup 中的值之后的行。

一个技巧是捕获删除。当数据被删除时,该事实会记录到表中。例如,每个跟踪的表(例如 Transactions)可以有一个相应的 DeletedTransactions 表。他们只需要两列(id,日期时间)。为它们命名的删除表将被带过来并重播。

数据分别通过 Select into Outfile 和 Load Data Infile 导出和导入。这些是逗号分隔值 (CSV) 文件,不是格式为 mysqldump。原因是性能,可以看一个轶事例子Here ,尽管是一个极端的例子。

您如何处理这些文件的维护(包括命名)将决定您将系统恢复到时间线上的任何保存点的容易程度。

资源:

快速视觉效果让您快速上手

create table LastBackup
(   theWhen datetime not null
);

create table Transactions
(   id int auto_increment primary key,
    custId int not null,
    transTyp int not null,
    amount decimal(12,2) not null,
    dtUpdated datetime not null,
    key (dtUpdated)
);

create table DeletedTransactions
(   -- a delete trigger on Transactions table does an insert here for the id
    id int not null,        -- the Transactions.id value
    dtWhen datetime not null    -- when it happened
);


truncate table Transactions;
insert Transactions (custId,transTyp,amount,dtUpdated) values
(123,1,100,'2014-07-11 14:10:00'),
(111,2,2100,'2014-07-11 14:10:01');
-- imagine if you had 10 million of those rows

-- time for the first backup, getting everything
truncate table LastBackup;
insert into LastBackup (theWhen) values ('2015-12-06');

select id,custId,transTyp,amount,dtUpdated
into outfile 'c:\\dev\\transactions_20151206.txt' -- or /path/to/file/xxx.txt for linux
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n' -- or '\n' for linux
FROM transactions
where dtUpdated<'2015-12-06';   -- this will be a range on subsequent delta backups

这是刚刚导出的文本文件:

1,123,1,100.00,"2014-07-11 14:10:00"
2,111,2,2100.00,"2014-07-11 14:10:01"

关于php - 导出和导入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112649/

相关文章:

即使在正确的 'yum remove' 和 'yum install' 之后,MySQL 仍保留早期安装的密码

php - 按用户评论过滤 - SQL 参数数量必须在 0 到 65535 之间

java - 是否有使用 Spring 3.0 和 Cassandra 作为后端的示例/教程?

php - Youtube Zend Api函数中断脚本

php - 我们如何计算 aaray 的结束位置?

php - 为什么这个 PDO 语句会默默地失败?

java - 如何使用分布式API连接数据库?

php - PHP中用变量替换类名

php - 日期不工作的 PDO bindParam

java - Android - 通过另一个类向 String[] 添加值