导出和导入数据库

时间:2015-12-06 00:38:37

标签: php mysql database mysqli import

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

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

2 个答案:

答案 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语句选择有限数量的行,并根据导出大小限制导出它们