如题,用mysqldump命令,从mysql服务器上备份数据库并生成了db.sql这样一个脚本文件,脚本文件中存储过程是包含了/**/和#开头的注释信息的。指令如下:
mysqldump -u用户名 -p密码 --default-character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob -x 数据库名  > G:\db.sql
将db.sql用ftp传到linux服务器上去,然后使用如下指令还原数据库:
mysql -u用户名 -p密码 数据库名 < /usr/test/db.sql还原结束后,查看存储过程定义,发现先前写在存储过程里面的备注信息全部丢失。请问有什么办法可以解决这个问题吗?丢失了存储过程的版本和修改日志等备注信息,日后维护会很不方便。

解决方案 »

  1.   

    你把注释写到存储过程的begin 和 end 之间,这样就不会丢失了。写在前头的,会丢失。
      

  2.   

    谢谢你的回复,我的注释的确是写在BEGIN和END之间的。下面的我的一个示例存储过程:DELIMITER $$CREATE DEFINER=`root`@`localhost` FUNCTION `UF_Get_tMaxCode`(
        V_iType INT
    ) RETURNS varchar(10) CHARSET utf8
    BEGIN
    /*
    业务描述:根据编码类别产生编码

    输入参数:
    V_iType:编码类别,定义建tMaxCode的iType字段的定义

    调用示例:
    SELECT UF_Get_tMaxCode(1);

    创建日期:
    创建人:

    */
    DECLARE iCode INT;

    IF V_iType IN (1,3)
    THEN
    #非订单类
    IF EXISTS (SELECT dtLast FROM tMaxCode WHERE iType=V_iType LIMIT 0,1)
    THEN 
    SELECT IFNULL(iMax,0)+1 INTO iCode FROM tMaxCode WHERE iType=V_iType;
    ELSE
    SET iCode=1;
    END IF;
    SELECT IFNULL(iMax,0)+1 INTO iCode FROM tMaxCode WHERE iType=V_iType;
    ELSE
    #订单类
    IF EXISTS (SELECT iMax FROM tMaxCode WHERE iType=V_iType AND DATEDIFF(dtLast,CURRENT_DATE)=0 LIMIT 0,1)
    THEN 
    #上次生成时间是当天
                SELECT IFNULL(iMax,0)+1 INTO iCode FROM tMaxCode WHERE iType=V_iType;
    ELSE
    SET iCode=1;
    END IF;
    END IF;

    IF EXISTS (SELECT iMax FROM tMaxCode WHERE iType=V_iType LIMIT 0,1)
    THEN 
    UPDATE tMaxCode
    SET
    iMax=iCode,
    dtLast=CURRENT_DATE
    WHERE
    iType=V_iType;
    ELSE 
    INSERT INTO tMaxCode (iType,iMax,dtLast)
    SELECT V_iType,iCode,CURRENT_DATE;
    END IF;
            
    IF V_iType IN (1,3)
    THEN
    #非订单类编码 
    RETURN CONCAT('',iCode);
    ELSE
    #订单类编码
    IF iCode BETWEEN 1 AND 9
    THEN
    RETURN CONCAT('0000',iCode);
    ELSEIF iCode BETWEEN 10 AND 99
    THEN 
    RETURN CONCAT('000',iCode);
    ELSEIF iCode BETWEEN 100 AND 999
    THEN 
    RETURN CONCAT('00',iCode);
    ELSEIF iCode BETWEEN 1000 AND 9999
    THEN 
    RETURN CONCAT('0',iCode);
    ELSE
    RETURN CONCAT('',iCode);
            END IF;
        END IF;
    END
    $$DELIMITER ;但是恢复之后,备注信息一样是丢失了。
      

  3.   


    在mysqldump的参数上加上-I会报错,加上-i,导出的脚本/**/和#备注的信息就直接没有了。
    而mysql这个程序的-I的定义是:-I, --help          Synonym for -?请问能给出一个可用的脚本指令吗?谢谢
      

  4.   

    这个没办法。
    #非订单类编码  
    RETURN CONCAT('',iCode);这种信息会做为备注而不被执行。
      

  5.   

    http://bugs.mysql.com/bug.php?id=23002
    参考下面这两段,看看有帮助没:
    [26 Oct 2007 15:14] Stefan Nordhausen 
    [31 Dec 2007 13:08] Gleb Shchepa 
      

  6.   

    根据gleb的回答,就是此问题无解,  因为他说 默认就是 --skip --comments
      

  7.   

    那么,我在恢复的时候,用mysql -u用户名 -p密码 --comments 数据库名 < /usr/test/db.sql,不知道能解决不,一会儿测试下
      

  8.   

    default-character-set 放到配置文件中,
    ./mysqldump --opt -hIP -u -p-R --triggers --single-transaction --flush-logs --database  |gzip> $stordir/resou$today.gz
      

  9.   

    没有办法! 你mysql <xx.sql 其实就是在执行这些SQL语句,此时#之后的内容会被当成SQL语句的备注根本不会执行。唯一的办法,就有你单独一句一句自己执行。
      

  10.   

    #非订单类编码比如上面这一句,您可以这样修改
    /*!99999 非订单类编码 */;用一个很大的version,保证不会被执行,这种注释应该不会被忽略,您试一试呢!