MySQL中表的复制以及大型数据表的备份教程


Posted in Python onNovember 25, 2015

表复制
mysql拷贝表操作我们会常常用到,下面就为您详细介绍几种mysql拷贝表的方式,希望对您学习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 
 
2. 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句的结果建一个表。所以newadmin这个表不会有主键,索引。

CREATE TABLE newadmin AS  
(  
SELECT *  
FROM admin  
)

 
3. 如果你要真正的复制一个表。可以用下面的语句。

CREATE TABLE newadmin LIKE admin;  
INSERT INTO newadmin SELECT * FROM admin;

 
4. 我们可以操作不同的数据库。

CREATE TABLE newadmin LIKE shop.admin;  
CREATE TABLE newshop.newadmin LIKE shop.admin;

 
 
5. 我们也可以拷贝一个表中其中的一些字段。

CREATE TABLE newadmin AS  
(  
SELECT username, password FROM admin  
)

 
6. 我们也可以讲新建的表的字段改名。

CREATE TABLE newadmin AS  
(  
SELECT id, username AS uname, password AS pass FROM admin  
)

 
7. 我们也可以拷贝一部分数据。

CREATE TABLE newadmin AS  
(  
SELECT * FROM admin WHERE LEFT(username,1) = 's'  
)

 
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就行。

例子:
要备份的表:

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,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_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 ;

 
操作:
先备份原始表wubx里的数据:
进行:

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的操作:

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=',user_id,',friend_id=',friend_id,',dir_id=',dir_id,',created=',created,' where id=',id,';') from wubx_uu;”>>backup_uu.sql

取出delete的操作:

mysql -e “select concat(‘delete from wubx where id=',id,';') from wubx_dd”>>backup_dd.sql

这样利用这些逻辑的备份加是完毕备份恢复到当前恢复点就很容易了。这里不演示。

这个操作最好用一个程序完成,当取完罗辑备份后,做一个标记点去清楚备份完的数据,以保证,逻辑记录表里的数据量比较少是正确的。

Python 相关文章推荐
python正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
python 动态加载的实现方法
Dec 22 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 Python
python基础知识小结之集合
Nov 25 #Python
python 多线程实现检测服务器在线情况
Nov 25 #Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 #Python
简单解决Python文件中文编码问题
Nov 22 #Python
Python制作简单的网页爬虫
Nov 22 #Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 #Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 #Python
You might like
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
XP折叠菜单&仿QQ2006菜单
2006/12/16 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
python获取指定网页上所有超链接的方法
2015/04/04 Python
Python绘制3D图形
2018/05/03 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
python3实现字符串操作的实例代码
2019/04/16 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python实现logistic分类算法代码
2020/02/28 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
制药工程专业职业生涯规划范文
2014/03/10 职场文书
公司股权转让协议书
2014/04/12 职场文书
交通事故协议书范文
2014/04/16 职场文书
标枪加油稿
2015/07/22 职场文书