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 这样利用这些逻辑的备份加是完毕备份恢复到当前恢复点就很容易了。这里不演示。 这个操作最好用一个程序完成,当取完罗辑备份后,做一个标记点去清楚备份完的数据,以保证,逻辑记录表里的数据量比较少是正确的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql – 自动更正数据框中所有变量类的任何方法
- 关于重新组织和重新生成索引sp_RefreshIndex的介绍
- SQL COUNT()/ LEFT JOIN?
- 解析SQL Server聚焦移除(Bookmark Lookup、RID Lookup、Ke
- 卸载SQL2008遇到问题(重启计算机失败、找不到SQL卸载程序)
- sqlserver日期函数
- SQLServer APPLY表运算符使用介绍
- sqlserver2008 数据库还原总提示空间不够System.Data.SqlCl
- sql-server – 在不同数据库模式之间同步数据的最佳技术?
- sql – 如何与“row_number()结束相反(按[Col]顺序分隔[Col