Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198927
  • 博文数量: 75
  • 博客积分: 2049
  • 博客等级: 大尉
  • 技术积分: 780
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-08 12:37
文章分类

全部博文(75)

文章存档

2011年(1)

2010年(9)

2009年(65)

我的朋友

分类: LINUX

2009-04-08 17:27:12

Mysql--备份与恢复

一:逻辑备份和恢复

1.    逻辑备份对于各种存储引擎,都可以用同样的方法来备份;而物理备份在不同的引擎有着不同的备份方法。

2.    备份

            备份所有数据库

C:\>mysqldump -uroot -p123456 --all-database > c:\all.sql

            备份数据库crashcourse

C:\>mysqldump -uroot -p123456 crashcourse > c:\crashcourse.sql

            备份数据库crashcourse下的表customersorderitems

C:\>mysqldump -uroot -p123456 crashcourse customers orderitems > c:\cust_order.sql

            备份数据库crashcourse下的表customers为逗号分割的文本

C:\>mysqldump -uroot -p123456 -T c:\  crashcourse customers --fields-terminated-by ,

            为了保证数据备份的一致性,Myisam存储引擎在备份的时候需要加上-l的参数,表示将所有表加上读锁,在备份期间,所有表将只能读而不能进行数据更新。但是对于事务存储引擎InnodbBDB来说,可以采用更好的选项—single-transaction,此选项将使得InnoDB存储引擎得到一个快照,使得备份的数据能够保持一致性。

3.    完全恢复例子

            上午11点备份数据库crashcourse

C:\>mysqldump -uroot -p123456 -lF crashcourse > c:\crashcourse.sql

此时crashcourseorderitems表的数据如下:

mysql> select * from orderitems;

+-----------+------------+---------+----------+------------+

| order_num | order_item | prod_id | quantity | item_price |

+-----------+------------+---------+----------+------------+

|     20005 |          1 | ANV01   |       10 |       5.99 |

|     20005 |          2 | ANV02   |        3 |       9.99 |

|     20005 |          3 | TNT2    |        5 |      10.00 |

|     20005 |          4 | FB      |        1 |      10.00 |

|     20006 |          1 | JP2000  |        1 |      55.00 |

|     20007 |          1 | TNT2    |      100 |      10.00 |

|     20008 |          1 | FC      |       50 |       2.50 |

|     20009 |          1 | FB      |        1 |      10.00 |

|     20009 |          2 | OL1     |        1 |       8.99 |

|     20009 |          3 | SLING   |        1 |       4.49 |

|     20009 |          4 | ANV03   |        1 |      14.99 |

+-----------+------------+---------+----------+------------+

11 rows in set (0.00 sec)

3.2    11点半备份完毕,然后,插入新的数据

mysql> insert into orderitems values(20008,2,'FB',10,2.0);

Query OK, 1 row affected (0.13 sec)

3.3            12点数据库突然故障,数据无法访问,需要恢复备份:

C:\>mysql -uroot -p123456 crashcourse < c:\crashcourse.sql

mysql> select * from orderitems;

+-----------+------------+---------+----------+------------+

| order_num | order_item | prod_id | quantity | item_price |

+-----------+------------+---------+----------+------------+

|     20005 |          1 | ANV01   |       10 |       5.99 |

|     20005 |          2 | ANV02   |        3 |       9.99 |

|     20005 |          3 | TNT2    |        5 |      10.00 |

|     20005 |          4 | FB      |        1 |      10.00 |

|     20006 |          1 | JP2000  |        1 |      55.00 |

|     20007 |          1 | TNT2    |      100 |      10.00 |

|     20008 |          1 | FC      |       50 |       2.50 |

|     20009 |          1 | FB      |        1 |      10.00 |

|     20009 |          2 | OL1     |        1 |       8.99 |

|     20009 |          3 | SLING   |        1 |       4.49 |

|     20009 |          4 | ANV03   |        1 |      14.99 |

+-----------+------------+---------+----------+------------+

11 rows in set (0.00 sec)

这和备份时的数据是一样的。

3.4            使用mysqlbinlog恢复来自完全备份以来的BINLOG.

mysql> select * from orderitems;

+-----------+------------+---------+----------+------------+

| order_num | order_item | prod_id | quantity | item_price |

+-----------+------------+---------+----------+------------+

|     20005 |          1 | ANV01   |       10 |       5.99 |

|     20005 |          2 | ANV02   |        3 |       9.99 |

|     20005 |          3 | TNT2    |        5 |      10.00 |

|     20005 |          4 | FB      |        1 |      10.00 |

|     20006 |          1 | JP2000  |        1 |      55.00 |

|     20007 |          1 | TNT2    |      100 |      10.00 |

|     20008 |          1 | FC      |       50 |       2.50 |

|     20008 |          2 | FB      |       10 |       2.00 |

|     20009 |          1 | FB      |        1 |      10.00 |

|     20009 |          2 | OL1     |        1 |       8.99 |

|     20009 |          3 | SLING   |        1 |       4.49 |

|     20009 |          4 | ANV03   |        1 |      14.99 |

+-----------+------------+---------+----------+------------+

12 rows in set (0.00 sec)

至此,数据库完全恢复

 

二:物理备份与恢复

1.    物理备份分为冷备份和热备份。物理备份的原理都是基于文件的cp

2.    冷备份对MyisamInnoDB的存储引擎都适合。

进行备份的操作如下:停掉Mysql服务,在操作系统级别备份Mysql的数据文件和日志文件到备份目录。

进行恢复的操作如下:首先停掉Mysql服务,在操作系统级别恢复Mysql的数据文件,然后重启Mysql服务,使用mysqlbinlog工具恢复自备份以来的所有BINLOG

3.    热备份:对于不同的存储引擎热备份方法也有所不同

3.1Myisam存储引擎

Myisam存储引擎的热备份方法很多,本质就是将备份的表加读锁,然后在cp数据文件到备份目录。常用的有以下两种:

A. shell> mysqlhotcopy db_name  [/path/to/new_directory]

B. mysqlhotcopy使用不正常的情况下,可以手工来做热备份,操作如下:

首先数据库中所有表加读锁:

C:\flush tables with read lock;

然后cp数据文件到备份目录即可。

3.2InnoDB存储引擎

IbbackupInnobase公司的一个热备份工具,专门对InnoDB存储引擎进行无力备份。

 

三:表的导入导出

1.    导出

1.1有时需要将表里的数据导出为某些符合分割的纯数据文本,而不是SQL语句。应用如下:

A:用来作为EXCEL显示;

B:单纯为了节省备份空间;

C:为了加速地加载数据,LOAD DATA 的加载速度比普通的SQL加载要快20倍以上。

1.2使用select … INTO OUTFILE … 命令来导出数据,例如:

将数据库crashcourse的表orderitems导出为数据文本,其中,字段分隔符为“,“,字段引用符为”

mysql> select * from orderitems into outfile 'c:\\orderitems.txt'  fields terminated by ","  enclosed by' "' ;

Query OK, 12 rows affected (0.16 sec)

orderitems.txt的内容如下:

"20005 ", "1 ", "ANV01 ", "10 ", "5.99 "

 "20005 ", "2 ", "ANV02 ", "3 ", "9.99 "

 "20005 ", "3 ", "TNT2 ", "5 ", "10.00 "

 "20005 ", "4 ", "FB ", "1 ", "10.00 "

 "20006 ", "1 ", "JP2000 ", "1 ", "55.00 "

 "20007 ", "1 ", "TNT2 ", "100 ", "10.00 "

 "20008 ", "1 ", "FC ", "50 ", "2.50 "

 "20008 ", "2 ", "FB ", "10 ", "2.00 "

 "20009 ", "1 ", "FB ", "1 ", "10.00 "

 "20009 ", "2 ", "OL1 ", "1 ", "8.99 "

 "20009 ", "3 ", "SLING ", "1 ", "4.49 "

 "20009 ", "4 ", "ANV03 ", "1 ", "14.99 "

 

 1.3select … INTO OUTFILE … 命令的转义注意:

A:当导出命令中包含字段引用符时,数据中含有转义符本身和字段引用符的字段需要被转义;

B:当导出命令中不包含字段引用符时,数据中含有转义符本身和字段分隔符的字段需要被转义。

1.4mysqldump导出数据为文本:

mysqldump -uroot -p123456 -T c:\  crashcourse customers --fields-terminated-by "," –fields-optionally-enclose-by by '"'

2.    导入

2.1使用LOAD DATA INFILE … INTO TABLE

mysql> load data infile  'c:\\orderitems.txt' into table orderitems  fields terminated by "," enclosed  by '"'  ;

2.2使用mysqlimport

C:\>mysqlimport -uroot -p123456 crashcourse  c:\orderitems.txt –fields-terminated by "," fields—enclosed-by '"'

阅读(858) | 评论(0) | 转发(0) |
0

上一篇:check_apache2.sh

下一篇:MySQL--备份和恢复

给主人留下些什么吧!~~