我在iPage上有一台服务器,我正在尝试找到一种正确备份数据库的方法。 iPage为我们提供了在一个文件中一次备份所有表的选项,或者在单独的文件中逐个备份。但问题是,我的表中有很多行,而且许多表经常超过每个文件10.24 MB的导入限制,更不用说我的iPage计划每小时最多查询限制为150,000个查询。这意味着,即使没有人在那个时间访问我的网站,并以这种方式使用查询,如果备份文件有超过150,000行,导入将在中间中断。
我知道这个问题肯定是模糊不清的,但我在这里要问的是建议我应该做什么,在这种情况下,成功备份我的文件,我可以导入我的整个如果可能的话,数据库成功而不会在中间中断。关于备份数据库的任何其他建议也是值得赞赏的。
答案 0 :(得分:1)
我会创建增量备份。每个具有显着大小的表,或者只是全部的表,都包含名为
的列dtUpdated datetime not null
不要让名称仅用于更新。相反,is在任何插入或更新时设置为now()
。
关键表中的auto_increment
ID肯定有助于增量备份。我不确定如果没有这样的话我会想尝试它(虽然没有必要)。对于下面的内容,我假设auto_increment
ID已就位。
要启动它并开始行动,最初让您的系统离线以获取任何新条目。
使用alter table
添加任何缺失的列,例如上述两个列。
将该列dtUpdated
的所有行设置为
'2015-12-06 00:00:00'
包括时间组件。请注意,now()
根本不是对于启动部分来说是一个不错的选择。
还有另一个表可能只有1行,1列,datetime
表示最后一次备份的datetime
。我们称这个表为LastBackup
。在您下次备份之前,不会更改。
最初设置此项,如上所述。
修改代码,使任何插入或更新都能及时更新dtUpdated
now()
Delta备份可能会更小,显着可能,只需从dtUpdated位于表LastBackup
中的值之后的表中获取这些行。
一个技巧是捕获删除。删除数据后,会将该事实记录到表中。例如,跟踪的每个表(例如Transactions)都可以具有相应的DeletedTransactions表。而且他们只需要两列(id,datetime)。将为其提供名称的删除表被重置并重放。
分别通过Select into Outfile和Load Data Infile导出和导入数据。这些是逗号分隔值( CSV )文件,格式为mysqldump
的不。原因在于表现,虽然是一个极端的例子,但可以看到一个轶事的例子Here。
如何处理这些文件的维护,包括命名将决定您将系统复活到时间轴上的任何Savepoint是多么容易。
资源:
让您前进的快速视觉
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"
答案 1 :(得分:0)
如果您的托管服务提供商支持,我建议使用mysqldump实用程序。您可以限制查询次数:
mysqldump --databases X --tables Y --where="1 limit xxx"
xxx = your query limit
http://shiplu.mokadd.im/110/splitting-huge-mysql-dump-for-easy-restore/
否则您只需使用select语句选择有限数量的行,并根据导出大小限制导出它们