加载中…
  
博文
分类: MySQL

MySQL的崩溃恢复crash_safe能力依赖于Redo Log事务日志。当MySQL更改数据的时候,它的设计思想是先对内存中的数据进行修改,并且写Redo Log,即更改数据,总是遵循WAL日志先行机制。


 

分类: MySQL
背景:
某核心实例出故障,业务反馈SQL无法响应,已经严重影响到业务了!运维火速登上DB查看,发现大量线程处于waitting for table flush状态,对tDeal表的SQL操作被堵住了,如下:


分析:
线程处于waitting for table flush状态,这代表什么呢?
(1)、这个状态表示的是:要对表做flush操作,但是一直处于等待状态,无法flush;
(2)、出现waitting for table flush状态的可能情况是:有一个flush tables命令被别的语句堵住了,而它又堵住了我们的select语句。从上图我们确实看到,很多select语句处于waitting for table flush状态;
(3)、在MySQL里面,对表做flush操作的用法,一般有:
a、flush tables;
b、flush tables with read lock;
c、flush table
分类: Python
在flask框架里面使用了python 的logging日志模块,由于错误异常时,能够记录日志内容到文件。
logger函数代码为:


代码多个地方需要打日志,在需要打日志的地方,代码为:
err_msg = 'xxxxxx'
logger = getLogger()
logger.error(err_msg)

结果代码运行过程中,发现日志内容出现很多重复,使得日志内容很臃肿,影响日志内容查看!

之所以出现这个问题的原因在于,我的代码里面多个地方都调用了 getLogger():
logger = getLogger()

每次调用getLogger(),都会添加一个FileHandler :
fh = logging.FileHandler(log_path,mode='a')

多次调用,就会添加多个FileHandler ,有多少个FileHandler ,就会在需要记录日志的地方,重
分类: vue前端

  
 

 实现代码为: 
 

 任务类型这一列的值如果是“None”,则显示红色,如下图: 
						
分类: MySQL
线上实例从库复制延迟,show slave status发现复制卡在一个位点不会动,如下图:
于是怀疑是主库上有大事务,在从库回放卡住了。之前一直以为,要查看是否卡在大事务上,需要到主库上去查看binlog,但是往往在主库上查看binlog,刷屏很久都看不到具体执行了什么大事务SQL。今天学到一种新方法,直接在从库上查看relay log,看卡在哪个地方(看Relay_Log_File和Relay_Log_Pos):

 show relaylog events in 'relay-bin.267885' from 18842859 limit 10;
分类: MySQL
主从同步报错,报错信息如下:
Last_Errno: 1114
Last_Error: Error 'The table 't_heap_log_action_game_dairy' is full' on query. Default database: 'fxtv_log'. Query: 'INSERT INTO `t_heap_log_action_game_dairy` VALUES (173522,368316,761217,23,20161024,1),(173523,368317,761217,23,20161024,1),(173524,843465,0,7,20161024,1),(173525,321557,19196,4,20161024,1),(173526,729559,1848213,29,20161024,1),(173527,1004730,0,29,20161024,1),(173528,772424,0,23,20161024,1),(173529,731819,0,7,20161024,1),(173530,282683,50399,16,20161024,1),(173531,344256,0,1196,20161024,1),(173532,319421,0,29,20161024,1),(173533,411831,1725387,747,20161024,1),(173534,964798,1995373,29,20161024,1),(173535,411831,0,4,20161024,1),(173536,282683,50399,32
分类: Python
在Python语法中,一般情况我们会这样写SQL:
SQL= 'UPDATE user SET nickname = %s WHERE uid = %s;'%(nickname,uid)
然后执行:
cursor.execute(SQL)

但是这样会带来安全问题,如果传入的参数uid是形如:vivaxiao;drop database xxx;
那么实际SQL就会变成:
UPDATE user SET nickname = %s WHERE uid = 'vivaxiao';drop database xxx;
这样就存在很大的风险了~

正确的写法应该是,对SQL语句的动态参数使用变量绑定的方式,而不是字符串格式化或者字符串拼接,如下:
SQL= 'UPDATE user SET nickname = %s WHERE uid = %s;'
params = (nickname,uid)
cursor.execute(SQL,params)
###如果参数只有一个,那么格式为:params = [nickname,]###


cursor.execute(SQL,params)执行时,会对params进行处理,如果params包含有“;”,则会进行特殊处理,比如替换成其他MySQL无法识别的符号,导致不能执行SQL。这样就能起到防止SQL注入了!

分类: Python
IP地址分为4个段,每个段上可能的取值如下
0-9        
10-99
100-199
200-249
250-255

0-9          [0-9]    
10-99        [1-9][0-9]
100-199      1[0-9][0-9]  
200-249      2[0-4][0-9]
250-255      25[0-5]

分类: MySQL

一、背景

从事DBA工作两年多以来,经常会遇到开发上线的SQL中含有多表关联join的查询,我自己本身也是比较抗拒的,很多DBA一般会建议开发拆分SQL,避免join带来的性能

(2016-10-30 20:08)
分类: MySQL

什么是Cardinality值?

并不是在所有的查询条件中出现的列都需要添加索引。对于什么时候添加B+树索引,一般的经验是,在访问表中很少一部分数据时使用B+树索引才有意义。例如,对于性别字段、地区字段、类型字段、状态字段,它们的可取值范围很小,成为低选择性的列。如:

select * from student where sex=F

按照性别查找时,可取值的范围一般是M

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有