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

Category Archives: MySQL

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

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

MySQL存储过程详解 mysql 存储过程

mysql存储过程详解      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。        关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。      MySQL存储过程的创建   (1). 格式 MySQL存储过程创建的格式:CREATE PROCEDURE 过程名 ([过程参数[,…]]) [特性 …] 过程体 这里先举个例子: mysql> DELIMITER // mysql> CREATE PROCEDURE proc1(OUT s int)     -> BEGIN     -> SELECT COUNT(*) INTO s FROM user;     -> END     -> // mysql> DELIMITER ; 注: (1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。 (2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。 (3)过程体的开始与结束使用BEGIN与END进行标识。 这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。   (2). 声明分割符   其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用MySQL的Administrator管理工具时,可以直接创建,不再需要声明。   (3). 参数 MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如: CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形…]) IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 OUT 输出参数:该值可在存储过程内部被改变,并可返回 INOUT 输入输出参数:调用时指定,并且可被改变和返回 Ⅰ. IN参数例子 创建: mysql > DELIMITER // mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int) -> BEGIN -> SELECT p_in; -> SET p_in=2; -> SELECT p_in; -> END; -> // mysql > DELIMITER ; 执行结果: mysql > SET @p_in=1; mysql > CALL demo_in_parameter(@p_in); +——+ | p_in | +——+ |   1  | +——+ +——+ | p_in | +——+ |   2  | +——+ mysql> SELECT @p_in; +——-+ | @p_in | +——-+ |  1    | +——-+ 以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值   Ⅱ.OUT参数例子 创建: mysql > DELIMITER // […]

龙生   30 May 2014
View Details

在mysql中的存储过程中使用事务transaction

一.在处理事务时,使用SQLException捕获SQL错误,然后处理; 按照这个推论,我们必须在MySQL存储过程中捕获SQL错误,最后判断是回滚(ROLLBACK)还是提交(COMMIT)。 所以存储过程为: DELIMITER $$   DROP PROCEDURE IF EXISTS  test_sp1 $$   CREATE PROCEDURE test_sp1( )       BEGIN       DECLARE t_error INTEGER DEFAULT 0;       DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;              START TRANSACTION;               INSERT INTO test VALUES(NULL, 'test sql 001′);                  INSERT INTO test VALUES('1', 'test sql 002′);                 IF t_error = 1 THEN               ROLLBACK;           ELSE               COMMIT;           END IF;          END$$   DELIMITER ;   在这个例子中,我们为test_sp1() 定义了一个 SQLEXCEPTION 参数 t_error, 在遇到SQL错误时,继续执行(CONTINUE); 如果执行状态没有错误,则提交,反之回滚! 二.在调用事务时,将事务的执行状态(即:事务是提交了还是回滚了),返回给被调者。 下面给出另一个例子: CREATE DEFINER=3dmodelbaseadmin@% PROCEDURE p_userConfirmPay( in p_lID int, in p_endTime DATETIME, in p_moneyAfterTax decimal(10,2), in p_integralAfterTax decimal(10,0), in p_sellerID int unsigned, in p_cashOrPoints int, in p_loginName_site varchar(50), in p_transactionID_site char(100), in p_orderID char(100), in p_remarks_site char(100), in p_transactionID char(100), in p_cMEMID INT UNSIGNED, in p_curTotal DECIMAL(10,2), in p_curTotalcIntegral decimal(10,0), in p_remarks char(100)) BEGIN DECLARE p_cMEMID_site INT; DECLARE p_balance_site […]

龙生   30 May 2014
View Details
1 20 21 22 24