一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Database

利用mysql的binlog恢复数据

MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库。用于slave端执行增删改,保持与master同步。 1.开启binary log功能 需要修改mysql的配置文件,本篇的实验环境是win7,配置文件为mysql安装目录\MySQL Server 5.1下的my.ini,添加一句log_bin = mysql_bin即可 eg: [mysqld] …… log_bin = mysql_bin …… log_bin是生成的bin-log的文件名,后缀则是6位数字的编码,从000001开始,按照上面的配置,生成的文件则为: mysql_bin.000001 mysql_bin.000002 …… 配置保存以后重启mysql的服务器,用show variables like  '%bin%’查看bin-log是否开启,如图: 2.查看产生的binary log bin-log因为是二进制文件,不能通过记事本等编辑器直接打开查看,mysql提供两种方式查看方式,在介绍之前,我们先对数据库进行一下增删改的操作,否则log里边数据有点空。 create table bin( id int(10) primary key auto_increment,name varchar(255));(测试前我已经建表) insert into bin(name) values ('orange'); 1.在客户端中使用  show binlog events in 'mysql_bin.000001'  语句进行查看,为了排序美观,可以在结尾加\G使结果横变纵,此时结尾无需加;语句结束符。 eg: mysql> show binlog events in 'mysql_bin.000001’\G ……………省略…………… *************************** 3. row *************************** Log_name: mysql_bin.000001 Pos: 174 Event_type: Intvar Server_id: 1 End_log_pos: 202 Info: INSERT_ID=2 *************************** 4. row *************************** Log_name: mysql_bin.000001 Pos: 202 Event_type: Query […]

龙生   12 Nov 2014
View Details

binlog文件分析与mysqlbinlog工具的修改

问题 本文主要带着以下问题进行学习: 1、什么是binlog,有什么作用 2、binlog有哪些格式 3、分析一条典型binlog ,说明从binlog中可以得到哪些信息 4、如何修改mysqlbinlog,使得可以显示最后一条记录 这里主要考虑binlog的使用及相关格式,而不是关注binlog的写入时机。   一、简介 binlog又叫二进制日志文件,它会将mysql中所有修改数据库数据的Query以二进制的形式记录到日志文件中,如:create,insert,drop,update等;(对于select操作则不会被记录到binlog里,因为它并没有修改数据库的数据)。binlog一般存储在数据目录下,并且命名为:mysql-bin.***(这个可以在配置文件中修改my.cnf:log-bin=mysql-bin,就是文件名的前缀;mysqld在每个 binlog 名后面添加一个数字扩展名。每次启动服务器或刷新日志时增加文件的大小大于max_binlog_size,一个事务不会被拆分开)。 binlog主要是用于保证数据完整的,如主从备份,通过从binlog文件中读取操作来在salve机上进行同样的操作,保证主从备份,当然不可能每次都从开始的地方redo,所以每条记录都有一个时间截TIMESTAMP。   二、简单的使用binlog show binary logs;    #显示binlog文件 purge binary logsto 'mysql-bin.**'  #删除到**文件 bin/mysqlbinlog binlogfile    #解析binlog文件   利用binlog恢复数据: bin/mysqlbinlog  --start-datetime=’2011-7-7 18:0:0′--stop-datetime=’2011-7-7 20:07:13′ data/mysql-bin.000008 |mysql -u root   三、类型 binlog的格式有三种,这也反应了mysql的复制技术:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。 mysql>showvariables like 'binlog_format'    #查看binlog的格式   使用mysqlbinlog解析的binlog: MIXED(STATEMENT): # at 193(开始位置) #110708 10:03:06(时间截) server id(产生该事件的服务id) 1  end_log_pos(日志的结束位置) 280  Query(事件类型)  thread_id=10    exec_time=0     error_code=0 SETTIMESTAMP=1310090586/*!*/; insert into tvalues(17) /*!*/;   ROW模式: BEGIN /*!*/; # at 174 # at 214 #110708 10:49:22server id 1  end_log_pos 214   Table_map: […]

龙生   12 Nov 2014
View Details

Mysql Binlog三种格式介绍及分析

一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在binlog中。 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。) 缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题). 使用以下函数的语句也无法被复制: * LOAD_FILE() * UUID() * USER() * FOUND_ROWS() * SYSDATE() (除非启动时启用了 --sysdate-is-now 选项) 同时在INSERT …SELECT 会产生比 RBR 更多的行级锁 2.Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。 优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题 缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。 3.Mixedlevel: 是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。   二.Binlog基本配制与格式设定 1.基本配制 Mysql BInlog日志格式可以通过mysql的my.cnf文件的属性binlog_format指定。如以下: binlog_format           = MIXED                 //binlog日志格式 log_bin                  =目录/mysql-bin.log    //binlog日志名 expire_logs_days    = 7                //binlog过期清理时间 max_binlog_size    100m                    //binlog每个日志文件大小 2.Binlog日志格式选择 Mysql默认是使用Statement日志格式,推荐使用MIXED. 由于一些特殊使用,可以考虑使用ROWED,如自己通过binlog日志来同步数据的修改,这样会节省很多相关操作。对于binlog数据处理会变得非常轻松,相对mixed,解析也会很轻松(当然前提是增加的日志量所带来的IO开销在容忍的范围内即可)。 3.mysqlbinlog格式选择 mysql对于日志格式的选定原则:如果是采用 INSERT,UPDATE,DELETE 等直接操作表的情况,则日志格式根据 binlog_format 的设定而记录,如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何 都采用 SBR 模式记录 三.Mysql Binlog日志分析 通过MysqlBinlog指令查看具体的mysql日志,如下: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SET TIMESTAMP=1350355892/*!*/; BEGIN /*!*/; # at 1643330 #121016 10:51:32 server […]

龙生   12 Nov 2014
View Details

Windows下MySQL日志的启用

1.    首先连接上mysql,查看日志服务是否开启 点击(此处)折叠或打开 show global variables like \’log_bin%\'; 输入上面的命令可以查看当前mysql的日志服务是否开启,图为OFF状态,表示还未开启,MySQL默认状态下是未开启日志服务的。 2.    开启日志服务 配置MySQL根目录下的my.ini文件,在[mysqld]下面添加存放日志的路径,此处我写的是绝对路径,在MySQL的根目录下我创建了log/log-bin/logbin.log路径, 创建目录时要注意以下两点: a)    目录的文件夹命名中不能有空格,否则在访问日志时会报错。 b)    指定目录时要以*.log结尾,即不能仅仅指定到文件夹的级别,上面我创建的路径写了logbin.log,那么在log/log-bin/目录下会产生logbin.000001和logbin.index两个日志文件; 否则不会有日志文件产生。 3.    重启mysql服务 my.ini文件修改后保存,需要重启mysql服务才能生效。windows下右键“计算机”->“管理”->“服务和应用程序”->“服务”里面,选择“MySQL”,然后点击“重启动”,即完成重启服务。 4.    再次查看mysql的日志服务状态,就会看到开启状态 5.    查看日志 在DOS状态下,进入MySQL的bin目录下执行mysqlbinlog命令,可以查看指定的日志文件,例如查看logbin.000001日志 要注意查看日志的目录,因为我的日志目录是和bin在同一级别中,因此先../返回上级目录,再查找log/log-bin/logbin.000001日志。 from:http://blog.itpub.net/29660208/viewspace-1188431/

龙生   12 Nov 2014
View Details

MySQL中时间-->数字转换和IP地址-->数字转换

后台有很字段都是采用时间戳的形式,二者如何转换的,每次都搜索,真麻烦,就记下来吧。其实时间和IP类型的字段都有数字来存储的话,还是优点还是很大的,最直接的就是会省掉不少的存储空间。 1、将时间转换为时间戳 select unix_timestamp('2009-10-26 10-06-07') 如果参数为空,则处理为当前时间 2、将时间戳转换为时间 select from_unixtime(1256540102) 有些应用生成的时间戳是比这个多出三位,是毫秒表示,如果要转换,需要先将最后三位去掉(标准的10位数字,如果是13位的话可以以除以1000的方式),否则返回NULL 还有就是IP地址和数字之间的转换: 1.将IP地址转化为数字 select inet_aton('210.30.0.103'); 2.将数字转化为IP地址 select inet_ntoa(3525181543); ___________________________________________________________________ mysql日期和时间格式转换 对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。 这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。 mysql> select DAYOFWEEK('1998-02-03'); -> 3 WEEKDAY(date) 返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。 mysql> select WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> select WEEKDAY('1997-11-05'); -> 2 DAYOFMONTH(date) 返回date的月份中日期,在1到31范围内。 mysql> select DAYOFMONTH('1998-02-03'); -> 3 DAYOFYEAR(date) 返回date在一年中的日数, 在1到366范围内。 mysql> select DAYOFYEAR('1998-02-03'); -> 34 MONTH(date) 返回date的月份,范围1到12。 mysql> select MONTH('1998-02-03'); -> 2 DAYNAME(date) 返回date的星期名字。 mysql> select DAYNAME("1998-02-05"); -> 'Thursday' MONTHNAME(date) 返回date的月份名字。 mysql> […]

龙生   30 Oct 2014
View Details

Sql2008 全文索引 简明教程

在SQL Server 中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数 据的速度,不用在用LIKE这样低效率的模糊查询了。 下面简明的介绍如何使用Sql2008 全文索引 一、检查服务里面带有Full-text字样的服务是否存在并开启 如果不存在带有Full-text字样的服务的,确认是否安装了sqlserverFullTextSearch 二、新建全文目录 全文目录是用来存储全文索引的 三、为表定义全文索引 四、点击下一步,按提示选择 1.确认下一步 2.选择唯一索引,通常是主键 3.选择要建立的全文索引列,对于断字符的选择如果列存的是中文就选择chinese,如果是英文就选择English 4.选择索引更新方式,可以先自动更新,以后数据量大了可以设置添加全文索引的计划 5.选择全文目录 五、全文索引的SQL查询关键字 建立好全文索引后就可以使用SQL语句来查询了,主要用带三个关键字 CONTAINS、FREETEXT、CONTAINSTABLE和FREETEXTTABLE 1. CONTAINS 搜索单个词和短语的精确或模糊的匹配项,要搜索的内容必须是个有意义的词语,比如说“苹果”、“建设厅”,不能是一些没意义的词语,比如“阿迪撒啊是”,“儿儿的”这样的词语即使 LIKE是能查询出来,但全文索引对这样没意义的词语可能没有建立索引,查不出来 [sql] view plaincopy SELECT * FROM dbo.Business WHERE CONTAINS(Address,'旅游') 实现功能:查询Business表中Address列包含“旅游”的行 详细查看:http://msdn.microsoft.com/zh-cn/library/ms187787.aspx 2. FREETEXT 和CONTAINS类似,不同的是它会先把要查询的词语先进性分词然后在查询匹配项 [sql] view plaincopy 01.select * 02.from dbo.Business 03.where freetext(Address,'带婴儿旅游') 详细查看:http://msdn.microsoft.com/zh-cn/library/ms176078.aspx 3.CONTAINSTABLE 在查询方式上与 CONTAINS 几乎一样。但CONTAINSTABLE 返回的是符合查询条件的表,在 SQL 语句中我们可以把它当作一个普通的表来使用,并且使用 CONTAINSTABLE 的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。 [sql] view plaincopy SELECT  * FROM    Business AS FT_TBL         INNER JOIN CONTAINSTABLE(Business, *, 'ISABOUT (婴儿 WEIGHT (.8),赤水 WEIGHT (.4) )')         AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数。表示不同条件有不同的侧重。 CONTAINSTABLE 返回的表包含有特殊的两列:KEY,RANK。 被全文索引的表必须有唯一索引。这个唯一的索引列在返回的表中就成为 KEY。我们通常把它作为表连接的条件。 在某些网站搜索时,结果中会出现表示匹配程度的数字,RANK 与此类似。它的值在0~1000之间,标识每一行与查询条件的匹配程度,程度越高,RANK 的值大,通常情况下,按照 RANK 的降序排列。  详细查看:http://msdn.microsoft.com/zh-cn/library/ms189760.aspx 4. FREETEXTTABLE 在查询方式上与 FREETEXT 几乎一样。但 FREETEXTTABLE 返回的是符合查询条件的表,在 SQL 语句中我们可以把它当作一个普通的表来使用,并且使用  FREETEXT  的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。 [sql] view plaincopy SELECT  * ,         BusinessID ,         Address FROM    Business AS FT_TBL […]

龙生   22 Sep 2014
View Details

mysql存储过程示例

普通过程 DELIMITER // CREATE DEFINER=root@% PROCEDURE proc_insert() BEGIN insert into logs(hyname,hynumber,ip,software) values('lf4′,’nn',’127.0.0.1′,’测试'); insert into logs(hyname,hynumber,ip,software) values('lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5lf5′,’nn2′,’127.0.0.1′,’测试'); END// DELIMITER ; 带事务的过程 DELIMITER // CREATE DEFINER=root@% PROCEDURE proc_insert_tran() BEGIN DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; START TRANSACTION; insert into logs(hyname,hynumber,ip,software) values('lf2′,’nn',’127.0.0.1′,’测试'); insert into logs(hyname,hynumber,ip,software) values('lf3lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2lf2′,’nn2′,’127.0.0.1′,’测试'); IF t_error = 1 THEN ROLLBACK; ELSE COMMIT; END IF; END// DELIMITER ; 分页存储过程 DELIMITER // CREATE DEFINER=root@% PROCEDURE proc_paging( in pi_fields varchar(2000), in pi_tables text, in pi_where varchar(2000), in pi_orderby varchar(200), in pi_pageindex int, in pi_pagesize int, out […]

龙生   16 Aug 2014
View Details

维基逃离MySQL 力挺开源数据库

MariaDB也是由MySQL创始人发明的。并且由于MySQL被甲骨文收购,正在成为开源数据库的主流。 据悉,维基传媒基金会负责网站架构的高层Asher Feldman透露,他最近将维基百科中的英文百科全书,转移到了MariaDB 5.5.28数据库。他透露,明年一季度末期,有望把整个百科全书切换到新的开源数据库。 在谈到更换数据库平台的原因时,这位高层表示,主要目的并不是新数据库性能更好,维基传媒基金会以及整个开源社群,都希望能够推动开源数据库MariaDB的普及。 MariaDB官网 我们可以从MariaDB官网上看到,MariaDB数据库的定位就是MySQL的替代者。 有国外媒体指出,此次维基百科选用MariaDB,势必让全球诸多采用Linux, Apache, MySQL, PHP/Python/Perl (LAMP)套件技术的开发者更多关注MariaDB。 from:http://database.51cto.com/art/201212/373189.htm

龙生   30 Jun 2014
View Details

mysql修改表、字段、库的字符集

修改数据库字符集:

把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:

只是修改表的默认字符集:

修改字段的字符集:

查看数据库编码:

查看表编码:

查看字段编码:

来源:http://www.diannaowa.com/index.php/archives/233

from:http://fatkun.com/2011/05/mysql-alter-charset.html

1 30 31 32 44