一直用mysqldump备份数据库,命令如下:mysqldump -uuser -ppsd --opt -R temp > temp.sql
再用mysql命令恢复数据库,命令如下:mysql -uuser -ppsd --opt -R temp < temp.sql
没有出过问题。最近因为业务需要在mysql里增加了几个自定义函数,备份数据库没有问题,但用上面的语句恢复数据库时报语法错。
试着用可视化之类的客户端工具恢复数据库依然失败,后来打开备份文件看到备份sql如下,感觉语法根本不对。部分语法如下:
--
-- Dumping routines for database 'temp'
--
DELIMITER ;;
/*!50003 DROP FUNCTION IF EXISTS `get_split_count` */;;
/*!50003 SET SESSION SQL_MODE="NO_AUTO_VALUE_ON_ZERO"*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`kmadmin`@`%`*/ /*!50003 FUNCTION `get_split_count`(
f_string varchar(1000),f_delimiter varchar(5)
) RETURNS int(11)
BEGIN
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END */;;
上面的一堆/*!50003导致的报错,不知怎么来的。但我是用mysql自带的工具和标准命令备份的,难道也会出错。
我再试着用客户端工具备份(带自定义函数),则恢复没有问题,看着导出的语法也很正常。看来确实是mysqldump的问题我再试着加了视图、存储过程、触发器,发现都不能恢复成功,有经验的朋友请看看怎么解决这个问题?不是mysqldump的bug吧????
我的mysql版本是5.0.67,window和linux环境情况都试了,结果一样。
再用mysql命令恢复数据库,命令如下:mysql -uuser -ppsd --opt -R temp < temp.sql
没有出过问题。最近因为业务需要在mysql里增加了几个自定义函数,备份数据库没有问题,但用上面的语句恢复数据库时报语法错。
试着用可视化之类的客户端工具恢复数据库依然失败,后来打开备份文件看到备份sql如下,感觉语法根本不对。部分语法如下:
--
-- Dumping routines for database 'temp'
--
DELIMITER ;;
/*!50003 DROP FUNCTION IF EXISTS `get_split_count` */;;
/*!50003 SET SESSION SQL_MODE="NO_AUTO_VALUE_ON_ZERO"*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`kmadmin`@`%`*/ /*!50003 FUNCTION `get_split_count`(
f_string varchar(1000),f_delimiter varchar(5)
) RETURNS int(11)
BEGIN
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END */;;
上面的一堆/*!50003导致的报错,不知怎么来的。但我是用mysql自带的工具和标准命令备份的,难道也会出错。
我再试着用客户端工具备份(带自定义函数),则恢复没有问题,看着导出的语法也很正常。看来确实是mysqldump的问题我再试着加了视图、存储过程、触发器,发现都不能恢复成功,有经验的朋友请看看怎么解决这个问题?不是mysqldump的bug吧????
我的mysql版本是5.0.67,window和linux环境情况都试了,结果一样。
解决方案 »
- 求教基于索引的排序的机制
- mysql有类似sqlserver聚合索引的索引类型么?
- ERROR 1146 (42S02): Table 'mysql.procs_priv' doesn't exist
- mysql 乱码问题
- ERROR 1044 (42000): Access denied for user 'root'@'192.168.0.3' to database 'rfc
- !!!!如何使用存储过程??很无知的问题--望指点!!!
- 向responses表插入数据总是报:unknown column 'sysdate' in 'field list'。???急
- 请问如何将数据导入到MYSQL(因数据量大,只能非远程),如何备份数据(在主机上)?如果回答确有帮助,分数最高300分
- 安装mysql-connector-net-6.6.4 总是失败 your system has not been mofifiel
- vf编写的数据库端/客户端的程序软件连接sql数据库,数据库端连接sql
- 求一语句:多表查询里的统计功能
- 求更新统计的sql语句
2、MYSQLDUMP -uroot --all-databases --add-drop-database -B -E -R -p >123.TXT
备份所有数据库、SP、UDF等待
3、恢复用
mysql -uroot -p*** database < aaa.sqL
show variables like 'log_bin_trust_function_creators';看看是否有权限。
还原前先执行下面这个试试。
set log_bin_trust_function_creators=1;
检查一下 temp.sql 中有没有 create function 语句。
在一楼我贴的内容里有备份sql你内容,create function 有,但被一堆/*!50003 包围着,不知为什么。
确认一下你的MYSQL的版本号。
源数据库和新数据库中都select version() 贴出来看一下。
在一楼也说过了,版本是5.0.67,源库和新库是同一个数据库,我就是在一个库上测试含有自定函数的备份恢复。我的恢复是用 mysql -uuser -ppsd --opt -R temp < temp.sql ,不行
用客户端工具sqlyog也不行但是,用sqlyog备份和恢复自定义函数没有问题,另sqlyog备份的自定义函数库用mysql -u..恢复也没问题。我觉得就是mysqldump的bug,否则真无法解释,唉......另外我翻出了一年前你回答别人的一个和我这个问题很类似的帖子,但似乎和我现在问题又不完全一样,还是无解。原帖如下:http://topic.csdn.net/u/20091126/11/d8b9ea89-9ca8-49e8-99a5-43b967fe35e4.html
/*!50003 DROP FUNCTION IF EXISTS `get_split_count` */;;
/*!50003 SET SESSION SQL_MODE="NO_AUTO_VALUE_ON_ZERO"*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`kmadmin`@`%`*/ /*!50003 FUNCTION `get_split_count`(
f_string varchar(1000),f_delimiter varchar(5)
) RETURNS int(11)
BEGIN
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END */;;另外你的那些参数是MYSQLDUMP的,MYSQL不要加这些参数,改成如下试试。
mysql -uuser -ppsd temp < temp.sql
现在我把数据库里所有的对象都清了,就留下一个自定义函数,然后用mysqldump加-R参数到处的完整sql语句如下:-- MySQL dump 10.11
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.0.67-community-nt/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;--
-- Dumping routines for database 'test'
--
DELIMITER ;;
/*!50003 DROP FUNCTION IF EXISTS `get_split_value` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`kmadmin`@`%`*/ /*!50003 FUNCTION `get_split_value`(
f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
DELIMITER ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;-- Dump completed on 2010-11-08 13:56:24
但是用mysql -uuser -ppsd temp < temp.sql 恢复还是不行,报语法错误,用sqlyog执行也不行,报一堆语法错误,但是sqlyog备份的sql就没有问题,mysql命令行也能恢复
都是同一个数据库,官方的脚本命令就不行,无语啊......
/*!50003 CREATE*/ /*!50020 DEFINER=`kmadmin`@`%`*/ /*!50003 FUNCTION `get_split_value`(
一开始执行自定义函数的脚本就报错
用sqlyog备份就没这些,恢复时不论是sqlyog本身还是mysql命令都很成功,
唉........................................
免费的东西不好用啊............
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.0.67-community-nt/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;--
-- Dumping routines for database 'test'
--
DELIMITER ;;
/*!50003 DROP FUNCTION IF EXISTS `get_split_value` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`kmadmin`@`%`*/ /*!50003 FUNCTION `get_split_value`(
f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
DELIMITER ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;-- Dump completed on 2010-11-08 13:56:24[/code]
文件名为test.sql。就是我在本地用 mysqldump -uroot -ppsd --opt -R test > test.sql
导出的。先清掉test库所有对象,再用 mysql -ukmadmin -pkmadmin@#$ test < test.sql
恢复就会报
ERROR 1064 (42000) at line 48:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2太晚了,先休息吧,谢谢。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.1.52-community MySQL Community Server (GPL)Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 licenseType 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show tables;
+----------------+
| Tables_in_csdn |
+----------------+
| suggest |
+----------------+
1 row in set (0.00 sec)mysql> show function status;
+------+-----------------+----------+----------------+---------------------+----
-----------------+---------------+---------+----------------------+-------------
---------+--------------------+
| Db | Name | Type | Definer | Modified | Cre
ated | Security_type | Comment | character_set_client | collation_co
nnection | Database Collation |
+------+-----------------+----------+----------------+---------------------+----
-----------------+---------------+---------+----------------------+-------------
---------+--------------------+
| csdn | get_split_count | FUNCTION | root@localhost | 2010-11-09 00:20:53 | 201
0-11-09 00:20:53 | DEFINER | | utf8 | utf8_general
_ci | latin1_swedish_ci |
+------+-----------------+----------+----------------+---------------------+----
-----------------+---------------+---------+----------------------+-------------
---------+--------------------+
1 row in set (0.01 sec)mysql>
然后我又卸载了5.1.52版本,再装上了5.0.67版本,同样的脚本,错误依旧。
如果您有时间的话可以试试5.0.67版本。如果没错,那我无语了。
如果有错,除了bug,我不知道该怎么解释...这么晚了还在操劳,实在是太感谢你了。我去睡觉去了,不然会被老婆骂死。呵呵