MySQL中表的復制以及大型數據表的備份教程
mysql拷貝表操作我們會常常用到,下面就為您詳細介紹幾種mysql拷貝表的方式,希望對您學習mysql拷貝表方面能夠有所幫助。
假如我們有以下這樣一個表:
1
2
3
4
5
|
id username password
-----------------------------------
1 admin *************
2 sameer *************
3 stewart *************
|
1
2
3
4
5
6
|
CREATE
TABLE
IF
NOT
EXISTS `admin` (
`id`
int
(6) unsigned
NOT
NULL
auto_increment,
`username`
varchar
(50)
NOT
NULL
default
''
,
`
password
`
varchar
(100)
default
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE=MyISAM
DEFAULT
CHARSET=latin1 AUTO_INCREMENT=4 ;
|
1. 下面這個語句會拷貝表結構到新表newadmin中。 (不會拷貝表中的數據)
CREATE TABLE newadmin LIKE admin
2. 下面這個語句會拷貝數據到新表中。 注意:這個語句其實只是把select語句的結果建一個表。所以newadmin這個表不會有主鍵,索引。
1
2
3
4
5
|
CREATE
TABLE
newadmin
AS
(
SELECT
*
FROM
admin
)
|
3. 如果你要真正的復制一個表。可以用下面的語句。
1
2
|
CREATE
TABLE
newadmin
LIKE
admin;
INSERT
INTO
newadmin
SELECT
*
FROM
admin;
|
4. 我們可以操作不同的數據庫。
1
2
|
CREATE
TABLE
newadmin
LIKE
shop.admin;
CREATE
TABLE
newshop.newadmin
LIKE
shop.admin;
|
5. 我們也可以拷貝一個表中其中的一些字段。
1
2
3
4
|
CREATE
TABLE
newadmin
AS
(
SELECT
username,
password
FROM
admin
)
|
6. 我們也可以講新建的表的字段改名。
1
2
3
4
|
CREATE
TABLE
newadmin
AS
(
SELECT
id, username
AS
uname,
password
AS
pass
FROM
admin
)
|
7. 我們也可以拷貝一部分數據。
1
2
3
4
|
CREATE
TABLE
newadmin
AS
(
SELECT
*
FROM
admin
WHERE
LEFT
(username,1) =
's'
)
|
8. 我們也可以在創建表的同時定義表中的字段信息。
1
2
3
4
5
6
7
8
|
CREATE
TABLE
newadmin
(
id
INTEGER
NOT
NULL
AUTO_INCREMENT
PRIMARY
KEY
)
AS
(
SELECT
*
FROM
admin
)
|
MySQL大表備份
這里所說的大表是超過4G以上的表,我目前見到過最大為60多G的單表,對於這種表每天一個全備可以說是一件很痛苦的事。
那么有沒有辦法,可以實現一個全備加增量的備份呢。
答案當然是有的。
在常規環境直可以用全備加binlog一同保存。
這種環境大多可以用一個Slave上進行備份操作。
思路:
先停止Slave的同步,刷新buffer,對於Innodb 如果想直接拷貝還需要把innodb_max_dirty_pages_pct這個值置為零,然后在執行一次flush tables;
就可以cp了。如果是Dump出來可以這這樣做。
這個方案目前來看也是比較完美的,但一個並發力度大的應用一天的Binlog有可能能達到50G-60G,這樣的系統開Binlog可以說是對系統的IO性能及整體性能都有早影響。
另一種方案就是基於表的上數據的羅輯變化進行備份。
主體思想:全備加邏輯備份。
邏輯備份:當有數據插入時,利用觸發器同時寫入另一個表,當數據更新時,我們同時記錄一下,更新后的數據情況到另一個表。
當有刪除操作時,只需要記錄一下,刪除的主建ID就行。
例子:
要備份的表:
1
2
3
4
5
6
|
CREATE
TABLE
`wubx` ( `id`
int
(11)
NOT
NULL
auto_increment,
`user_id`
int
(11)
NOT
NULL
default
'0'
,
`friend_id`
int
(11)
NOT
NULL
default
'0'
,
`dir_id`
int
(11)
NOT
NULL
default
'0'
,
`created`
int
(11)
NOT
NULL
default
'0'
,
UNIQUE
KEY
`id` (`id`)) ENGINE=InnoDB
DEFAULT
CHARSET=utf8;
|
對於這個表我們需要建一個記錄有新數據變化的表為:
1
2
3
4
5
6
7
|
mysql>
create
table
wubx_ii
like
wubx;
Query OK, 0
rows
affected (0.00 sec)
mysql>
create
table
wubx_uu
like
wubx;
Query OK, 0
rows
affected (0.00 sec)
mysql>
create
table
wubx_dd ( id
int
(11));
Query OK, 0
rows
affected (0.00 sec)
|
建立相應的觸發程器
記錄insert的操作:
1
2
|
delimiter //
create
trigger
wubx_ii
after
insert
on
wubx
for
each row
begin
insert
into
wubx_ii
set
id=new.id,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_id,created=new.created;
end
//
|
記錄update的操作:
1
|
create
trigger
wubx_uu
after
update
on
wubx
for
each row
begin
replace
into
wubx_uu
set
id=new.id,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_id,created=new.created;
end
//
|
記錄刪除的操作:
1
2
3
|
create
trigger
wubx_dd
after
delete
on
wubx
for
each row
begin
insert
into
wubx_dd
values
(old.id);
end
//
delimiter ;
|
操作:
先備份原始表wubx里的數據:
進行:
1
2
3
4
5
6
7
8
9
|
insert
into
wubx
values
(”,1,10,1,1198464252);
insert
into
wubx
values
(”,1,11,1,1198464252);
insert
into
wubx
values
(”,1,2,1,1198464252);
insert
into
wubx
values
(”,2,10,1,1198464252);
insert
into
wubx
values
(”,2,12,1,1198464252);
insert
into
wubx
values
(”,3,12,1,1198464252);
update
wubx
set
dir_id=5
where
user_id=3;
update
wubx
set
dir_id=4
where
user_id=3;
delete
from
wubx
where
user_id=2
and
friend_id=12;
|
現在要實現增量備份:
取出insert的操作:
1
|
mysql -e ”
select
concat(‘
replace
into
wubx
set
id=
',id,'
,user_id=
',user_id,'
,friend_id=
',friend_id,'
,dir_id=
',dir_id,'
,created=
',created,'
;')
from
wubx_ii;”>>backup_ii.sql
|
取出update的操作:
1
|
mysql -e ”
select
concat(‘
update
wubx
set
user_id=
',user_id,'
,friend_id=
',friend_id,'
,dir_id=
',dir_id,'
,created=
',created,'
where
id=
',id,'
;')
from
wubx_uu;”>>backup_uu.sql
|
取出delete的操作:
1
|
mysql -e “
select
concat(‘
delete
from
wubx
where
id=
',id,'
;')
from
wubx_dd”>>backup_dd.sql
|
這樣利用這些邏輯的備份加是完畢備份恢復到當前恢復點就很容易了。這里不演示。
這個操作最好用一個程序完成,當取完羅輯備份后,做一個標記點去清楚備份完的數據,以保證,邏輯記錄表里的數據量比較少是正確的。