MySQL中表的复制以及大型数据表的备份教程
|
表复制 假如我们有以下这样一个表: id username password ----------------------------------- 1 admin ************* 2 sameer ************* 3 stewart ************* 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 CREATE TABLE newadmin AS ( SELECT * FROM admin ) CREATE TABLE newadmin LIKE admin; INSERT INTO newadmin SELECT * FROM admin; CREATE TABLE newadmin LIKE shop.admin; CREATE TABLE newshop.newadmin LIKE shop.admin; CREATE TABLE newadmin AS ( SELECT username,password FROM admin ) CREATE TABLE newadmin AS ( SELECT id,username AS uname,password AS pass FROM admin ) CREATE TABLE newadmin AS ( SELECT * FROM admin WHERE LEFT(username,1) = 's' ) CREATE TABLE newadmin ( id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY ) AS ( SELECT * FROM admin ) MySQL大表备份 在常规环境直可以用全备加binlog一同保存。 思路: 这个方案目前来看也是比较完美的,但一个并发力度大的应用一天的Binlog有可能能达到50G-60G,这样的系统开Binlog可以说是对系统的IO性能及整体性能都有早影响。 另一种方案就是基于表的上数据的罗辑变化进行备份。 例子: 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; 对于这个表我们需要建一个记录有新数据变化的表为: 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的操作: 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的操作: create trigger wubx_uu after update on wubx for each row begin replace into wubx_uu set id=new.id,created=new.created; end// 记录删除的操作: create trigger wubx_dd after delete on wubx for each row begin insert into wubx_dd values(old.id); end// delimiter ; insert into wubx values(”,1,10,1198464252); insert into wubx values(”,11,2,12,3,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; 现在要实现增量备份: 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的操作: mysql -e ” select concat(‘update wubx set user_id=',' where id=',';') from wubx_uu;”>>backup_uu.sql 取出delete的操作: mysql -e “select concat(‘delete from wubx where id=',';') from wubx_dd”>>backup_dd.sql 这样利用这些逻辑的备份加是完毕备份恢复到当前恢复点就很容易了。这里不演示。 这个操作最好用一个程序完成,当取完罗辑备份后,做一个标记点去清楚备份完的数据,以保证,逻辑记录表里的数据量比较少是正确的。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
