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

 更新时间:2015年11月25日 14:23:07   投稿:goldensun  
这篇文章主要介绍了MySQL中表的复制以及大型数据表的备份教程,其中大表备份是采用添加触发器增量备份的方法,需要的朋友可以参考下

表复制
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 

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

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

相关文章

  • Django框架文件上传与自定义图片上传路径、上传文件名操作分析

    Django框架文件上传与自定义图片上传路径、上传文件名操作分析

    这篇文章主要介绍了Django框架文件上传与自定义图片上传路径、上传文件名操作,结合实例形式分析了Django框架文件上传的原理、步骤、实现方法以及图片上传时自定义上传路径、上传文件名的相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • python生成并处理uuid的实现方式

    python生成并处理uuid的实现方式

    这篇文章主要介绍了python生成并处理uuid的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python实现跨excel sheet复制代码实例

    python实现跨excel sheet复制代码实例

    这篇文章主要介绍了python实现跨excel sheet复制代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解决Tensorflow sess.run导致的内存溢出问题

    解决Tensorflow sess.run导致的内存溢出问题

    今天小编就为大家分享一篇解决Tensorflow sess.run导致的内存溢出问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 在Linux命令行中运行Python脚本的流程步骤

    在Linux命令行中运行Python脚本的流程步骤

    Python是一种高级编程语言,被广泛应用于数据科学、机器学习、Web 开发等领域,在Linux操作系统中,Python是一个默认安装的解释器,用户可以通过命令行界面(CLI)来运行Python脚本,在本文中,我们将详细介绍如何在Linux命令行中运行Python脚本,需要的朋友可以参考下
    2023-11-11
  • python使用for循环计算0-100的整数的和方法

    python使用for循环计算0-100的整数的和方法

    今天小编就为大家分享一篇python使用for循环计算0-100的整数的和方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python爬取某拍短视频

    Python爬取某拍短视频

    现在短视频可谓是一骑绝尘,吃饭的时候、休息的时候、躺在床上都在刷短视频,今天给大家带来python爬虫进阶 :美拍视频地址加密解析,需要的朋友可以参考下
    2021-06-06
  • python paramiko实现ssh远程访问的方法

    python paramiko实现ssh远程访问的方法

    这篇文章主要介绍了python paramiko模块实现ssh远程访问的方法,大家参考使用
    2013-12-12
  • python实现的用于搜索文件并进行内容替换的类实例

    python实现的用于搜索文件并进行内容替换的类实例

    这篇文章主要介绍了python实现的用于搜索文件并进行内容替换的类,涉及Python针对文件及字符串的相关操作技巧,需要的朋友可以参考下
    2015-06-06
  • Python数字图像处理代数之加减乘运算

    Python数字图像处理代数之加减乘运算

    这篇文章主要介绍了Python数字图像处理代数运算,对其中的加、减、乘运算分别作了详细的讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09

最新评论