假设重建一个几百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的数据。
阅读(3260) | 评论(0) | 转发(0) |