如图:这个字段本来是有数据的,总是会莫名的变成空值: 
猜想可能是程序的某个语句误操作导致,错误的让这个字段变成空值了。这个错误语句暂时也找不出来在哪。就是,有没有一种功能可以监视这个字段,update成空值的时候显示一个错误。这是我暂时能想到的办法。反正吧,就是找到这个字段莫名变成空值的原因。求助!数据库字段空值

解决方案 »

  1.   

    打开binlog,能够记录下来所有数据库更新操作
      

  2.   

    binlog日志文件记录错误日志文件。
      

  3.   

    打开你的一般查询日志,或者BINLOG。

    5.11.2. 通用查询日志
    如果你想要知道mysqld内部发生了什么,你应该用--log[=file_name]或-l [file_name]选项启动它。如果没有给定file_name的值, 默认名是host_name.log。所有连接和语句被记录到日志文件。当你怀疑在客户端发生了错误并想确切地知道该客户端发送给mysqld的语句时,该日志可能非常有用。
    mysqld按照它接收的顺序记录语句到查询日志。这可能与执行的顺序不同。这与更新日志和二进制日志不同,它们在查询执行后,但是任何一个锁释放之前记录日志。(查询日志还包含所有语句,而二进制日志不包含只查询数据的语句)。 服务器重新启动和日志刷新不会产生新的一般查询日志文件(尽管刷新关闭并重新打开一般查询日志文件)。在Unix中,你可以通过下面的命令重新命名文件并创建一个新文件:shell> mv hostname.log hostname-old.log
    shell> mysqladmin flush-logs
    shell> cp hostname-old.log to-backup-directory
    shell> rm hostname-old.log
    在Windows中,服务器打开日志文件期间你不能重新命名日志文件。你必须先停止服务器然后重新命名日志文件。然后,重启服务器来创建新的日志文件。5.11.3. 二进制日志
    二进制日志以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。注释:二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用。二进制日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。参见5.11.2节,“通用查询日志”。二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。参见第6章:MySQL中的复制。运行服务器时若启用二进制日志则性能大约慢1%。但是,二进制日志的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。当用--log-bin[=file_name]选项启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。如果未给出file_name值, 默认名为-bin后面所跟的主机名。如果给出了文件名,但没有包含路径,则文件被写入数据目录。建议指定一个文件名,原因参见A.8.1节,“MySQL中的打开事宜”。如果你在日志名中提供了扩展名(例如,--log-bin=file_name.extension),则扩展名被悄悄除掉并忽略。mysqld在每个二进制日志名后面添加一个数字扩展名。每次你启动服务器或刷新日志时该数字则增加。如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志。如果你正使用大的事务,二进制日志还会超过max_binlog_size:事务全写入一个二进制日志中,绝对不要写入不同的二进制日志中。为了能够知道还使用了哪个不同的二进制日志文件,mysqld还创建一个二进制日志索引文件,包含所有使用的二进制日志文件的文件名。默认情况下与二进制日志文件的文件名相同,扩展名为'.index'。你可以用--log-bin-index[=file_name]选项更改二进制日志索引文件的文件名。当mysqld在运行时,不应手动编辑该文件;如果这样做将会使mysqld变得混乱。可以用RESET MASTER语句删除所有二进制日志文件,或用PURGE MASTER LOGS只删除部分二进制文件。参见13.5.5.5节,“RESET语法”和13.6.1节,“用于控制主服务器的SQL语句”。二进制日志格式有一些已知限制,会影响从备份恢复。参见6.7节,“复制特性和已知问题”。保存程序和触发器的二进制日志的描述参见
      

  4.   

    1:先把这个字段的值加上,记录下时间T1
    2:检查表,发现这个字段变空了,记录时间T2
    3:在1之前把BINLOG打开,然后分析BINLOG
    mysqlbinlog --start-time=t1 --end-time=t2 binlogfile|grep tablename|grep update
    4:通过3找出是什么SQL执行的这个程序,然后找出是谁干的。
    5:把4找出来的这个人杀了,以绝后患。
      

  5.   

    建议你把涉及到这个表操作的程序中的insert 和 update语句进行检查,问题肯定出在这里
      

  6.   

    这不是错误,可能是一个普通的update成功语句
      

  7.   


    幻想着能不能有个工具,触发这个操作的时候能邮件提醒,然后去翻看mysql的查询日志,这样最快
      

  8.   

    开通sql日志,wintail监视所在位置的sql.log日志文件就行了
      

  9.   

    wintail是个工具,找个地方下载