Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504109
  • 博文数量: 65
  • 博客积分: 2925
  • 博客等级: 上尉
  • 技术积分: 1306
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-01 10:56
个人简介

2013

文章分类

全部博文(65)

分类: Mysql/postgreSQL

2011-11-29 09:49:37

假设重建一个几百GB大小的数据库,在差不多导完数据的时候,数据库出错了,数据库导入操作终止。
这个时候,你会选择重新花费十几个小时重导数据吗?

有些情况是不需要重头再做一次导入操作的,只要找到为什么导入操作终止,把问题解决完,就可以接着继续导……

比如:
导入的过程中出错
ERROR 1418 (HY000) at line 53: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

查到这是由于:FUNCTION  引起的

原因:
应该是开启了bin-log, 我们就必须指定我们的函数是否是 
1 DETERMINISTIC 不确定的 
2 NO SQL 没有SQl语句,当然也不会修改数据 
3 READS SQL DATA 只是读取数据,当然也不会修改数据 
4 MODIFIES SQL DATA 要修改数据 
5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。 如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

解决的方法:
方法一:在FUNCTION 指定一个参数
方法二:我们可以通过设置如下的参数来关掉这个。
mysql> set global log_bin_trust_function_creators=1;

先定位到导入数据出错的位置,然后重新执行一下创建FUNCTION的操作。再接着导完剩下的数据……



如果数据文件中,有几个数据库,有些数据库导完了,而有些还未导,怎样选取未导的数据库接着继续?
或者在几百GB的数据文件中,只需导入中间的某个数据库,那怎么选取?

比如导入操作在未执行完就中断,所以可能还有数据库未导入。
(1). 查看每个数据库的开始行号
[mysql@test tmp]$ cat -n dump_***.sql |grep "32312 IF NOT EXISTS"
    28  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db_monitor` /*!40100 DEFAULT CHARACTER SET latin1 */;
    89  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */;
   743  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
   776  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `dbdata` /*!40100 DEFAULT CHARACTER SET utf8 */;
161911  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `dbdata_other` /*!40100 DEFAULT CHARACTER SET latin1 */;

(2). 查看总的行号
[mysql@test tmp]$ wc -l dump_***.sql
162130 dump_***.sql
可知:dbdata导完了,只剩下dbdata_other库未导

(3). 将数据库dbdata_other导出
[mysql@test tmp]$ head -23 dump_***.sql > dbdata_other2011.sql
[mysql@test tmp]$ sed -n '161908,162130p' dump_***.sql >> dbdata_other2011.sql

导出后数据文件的大小:
-rw-r----- 1 mysql mysql 147G Nov  9 11:56 dump_***.sql
-rw-rw-r-- 1 mysql mysql 6.1M Nov 11 11:28 dbdata_other2011.sql

这样就不用为了6.1M的数据,而去导147G的数据。

阅读(3188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~