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