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调用短信猫控件实现发短信功能实例
Jul 04 Python
简介Python中用于处理字符串的center()方法
May 18 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
Django如何实现内容缓存示例详解
Sep 24 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
详解Numpy中的广播原则/机制
Sep 20 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 Python
python中的函数递归和迭代原理解析
Nov 14 Python
Python实现对adb命令封装
Mar 06 Python
如何用 Python 处理不平衡数据集
Jan 04 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 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预定义常量
2006/12/25 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
javascript中常用编程知识
2013/04/08 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
售后服务经理岗位职责
2014/02/25 职场文书
卖房协议书
2014/04/11 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
市场部岗位职责范本
2015/04/15 职场文书
校运会宣传稿大全
2015/07/23 职场文书
小学校园广播稿
2015/08/18 职场文书
公开致歉信
2019/06/24 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书