在MySQL中使用更新日志文件

你不可能随时备份数据,但你的数据丢失时,或者数据库目录中的文件损坏时, 你只能恢复已经备份的文件,而在这之后的插入或更新的数据,就无能为力了。解决这个问题,就必须使用更新日志。更新日志可以实时记录更新、插入和删除记录的SQL语句。

启用日志

当以--log-update=file_name选项启动时,mysqld将所有更新数据的SQL命令写入记录文件中。文件被写入数据目录并且有一个名字file_name.#,这里#是一个数字,它在每次执行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS语句、或重启服务器时加1。

如果你不指定file_name,缺省使用服务器的主机名。

如果你在文件命中指定扩展名,那么更新日志不再使用顺序文件,使用指定的文件。但是当你它在每次执行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS语句、或重启服务器时日志文件被清空。

更新记录很聪明,因为它仅仅记载真正更新数据的语句。因此一个用WHERE的UPDATE或DELETE找不到行,它就不被写入记录文件。它甚至跳过将设置一个列为它已经有的值的UPDATE语句。

重写日志

必须着重指出的是,在下列情况之一,将使用新的日志文件——日志文件的顺序自动增加(未指定file_name或者指定的file_name不包括扩展名)或者清空文件(指定的file_name包括扩展名):

命令mysqladmin refresh

命令mysqladmin flush-logs

SQL语句FLUSH LOGS

服务器重新启动

恢复日志内容

对于所有的更新日志文件,你都可以把它指定为mysql客户机的输入,来执行其中的SQL语句,恢复数据。例如:

shell>mysql

但是,你可能因为执行DROP DATABASE误删除了,希望只恢复该数据库的内容,为了这个目的,你可以使用--one-database选项:

shell>mysql --one-database db_name < hostname.nnn

如果你要批量恢复更新日志的数据,在Unix中可以这样:

$ ls –t –r –l hostname.[0-9]* | xargs cat | mysql --one-database db_name

注意由于文件是按时间时间排序的,如果你修改的其中的任何文件,都会因为顺序的错误导致可能导入错误的数据。

如果按文件顺序恢复数据,就去掉-t和-r选项:

$ ls -l hostname.[0-9]* | xargs cat | mysql --one-database db_name

总结

本节介绍了有关日志文件尤其是更新日志的操作。需要注意的是如何启用更新日志、服务器重写日志的时机、以及如何恢复更新日志的内容。尤其是其中的各种技巧,例如如何按照日志文件生成的时间顺序恢复日志,如何只恢复指定数据库的内容。

时间: 2024-11-02 16:16:38

在MySQL中使用更新日志文件的相关文章

mysql中删除二进制日志文件释放磁盘空间

这是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个 语句执行的时间,也会记录进去的. 这样做主要有以下两个目的: 1:数据恢复 如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失. 2:主从服务器之间同步数据 主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步. 处理方法分两种情况: 1:只有一个mysql服务器,那

log4j2 日志 配置-log4j2中如何设置日志文件的路径

问题描述 log4j2中如何设置日志文件的路径 例如我现在想在代码中指定好日志文件为c:log.log,可以让日志在没有配置文件的情况下也能写到文件里

mysql中如何更新数据库中的时间数据?

问题描述 mysql中如何更新数据库中的时间数据? 解决方案 update 表 set 字段='2011-1-1 0:0:0' where carid = 1 解决方案二: mysql创建存储过程(根据时间字段来更新数据)mysql获取数据库表最后更新时间,update_time 为null 解决方案三: 可以设置数据库自动产生时间,每次插入数据后都会自动产生时间,不用你手动插入

mysql如何检查物理磁盘中的二进制日志文件是否有丢失

问题场景:有时候因为磁盘损坏或人为原因错误删除了磁盘中的二进制文件,导致mysql中的show binary logs记录和实际的物理磁盘中的二进制文件不匹配 #binlogdiff.sh #!/bin/sh #ocpyang@126.com #作用:mysql中show binary logs记录的二进制日志文件和实际的物理文件比较,检查 #磁盘中对应的二进制日志文件是否有丢失 source /usr/local/mysql/scripts/mysql_env.ini binlog_init=

如何在MySql中记录SQL日志

SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ...   查了一下资料,My SQL可以用下面方法跟踪sql 语句,以下方法以Windows平台为例,linux雷同:   1  配置my.ini文件(在安装目录,linux下文件名为my.cnf)     查找到[mysqld]区段,增加日志的配置,如下示例: [mysqld] log="C:/temp/mysql.

阿里云MySQL的bin.000001日志文件清理方法

linux系统清理方法 删除数据库的操作日志,如下文件: mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 1.输入mysql -u root -p然后输入密码 2.成功进去后输入reset master;! mysql> reset master; Query OK, 0 rows affected, 1 warning (0.20 sec) 就可以清空mysql日志了,世界都清爽了- 3.如果不想mysql记录日志可以在my.ini中关闭掉

win7系统中的Log日志文件怎么删除

  1.首先,咱们需要返回到win7旗舰版系统的桌面位置,之后,咱们双击打开桌面的计算机,然后在打开的win7旗舰版电脑的资源管理器窗口中,咱们双击进入C盘中. 2.在打开的C盘中,咱们找到右上方的搜索框,然后输入*.log ,这时系统就会开机搜索C盘下所有的Log 日志文件了.   3.等到搜索完毕后,咱们win7旗舰版电脑中所有的相关文件就会全部显示出来,咱们按下CTRL + A 快捷键,全选Log文件,使用del来删除文件即可.

为什么logback在tomcat中运行时日志文件输出到eclipse目录下

问题描述 使用相对路径时,同样的logback日志配置文件,在jetty中运行会输出日志到当前项目的路径下,而部署到tomcat中就输出到eclipse根目录下了,有什么办法可以解决这个问题?我想了很久都不知道为什么.logback部分配置如下<appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicyclass="ch

linux系统中c++写日志文件功能分享_C 语言

简化了glog,只保留了写日志文件的功能,只是改写了linux版本,win版本未改写,可以用LOG(INFO)<< 输出日志也可用LOG_IF(INFO,condition)<<输出日志也可直接调用日志类Logger::GetInstance().Error 等方式写日志初始化时调用 InitLogging(argv[0],INFO,"./log/test");第一个参数是路径,第二个参数是最低日志级别,第三个参数表示日志文件的前缀和文件夹 FileHelper