回收InnoDB表空间
以下论述均假定innodb_file_per_table开启先用常规optimize回收:mysql> select count(*) from t; +----------+ | count(*) | +----------+ | 1200096 | +----------+ [mysql@even employees]$ ls -alh t.ibd -rw-rw---- 1 mysql dba 72M 10-08 17:39 t.ibd mysql> delete from t limit 800000; mysql> select count(*) from t; +----------+ | count(*) | +----------+ | 400096 | +----------+ [mysql@even employees]$ ls -alh t.ibd -rw-rw---- 1 mysql dba 72M 10-08 17:41 t.ibd mysql> opt
个性化设置 MySQL prompt 提示符
下面谈 4 种方法 ㈠ 在 Bash 层修改 MYSQL_PS1 变量[root@localhost ~]# export MYSQL_PS1="(\u@\h) [\d]> " [root@localhost ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 73 Server version: 5.5.28 MySQL Community Server (GPL) Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. Oracle is a regis
批量杀死 MySQL 连接
下面简述 2 种方法 ㈠ 巧用 information_schema.processlistmysql> select concat(\'KILL \',id,\';\') from information_schema.processlist where user=\'root\' into outfile \'/tmp/killall.txt\'; mysql> source /tmp/killall.txt; ㈡ 在 Bash 层用 AWK 实现 ① 杀掉所有mysqladmin -uroot -p processlist|awk -F "|" \'{print $2}\'|xargs -n 1 mysqladmin -uroot -p kill&n
MySQL bug:server-id默认被自动置为1
昨天同事在做主从时,从库报如下错误:Got fatal error 1236 from master when reading data from binary log: \'Misconfigured master - server id was not set\'粗粗看好像是master的server-id没有设置,但同事做如下查询:备库采集: root@localhost Fri May 23 14:18:59 2014 14:18:59 [(none)]> show variables like \'%server_id%\'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 2 | +---------------+-------+ 主库
运维故障:假如下次注意,可能不会这么幸运
最近开始做运维,连着2天发生过意外,虽然都有惊无险,但我认为是侥幸!故障记录如下:1. 2014-4-1 新项目上线,在执行DDL时忘了确认字符集,导致开发同学那边查出来是乱码。2. 2014-4-3 部署Oracle DG,自以为主库不是线上库,初始化后重启了主库发生事情是我们都喜欢事后诸葛亮,然后扪心自谓:"我下次注意",不要忘了,生产环境是随机行走的,你无法意料它的走向
我踩了mysqldump的一个地雷
我们先看2种情况:P 1:[ 21:56:33-root@ssdtest:~ ]#mysqldump -S /data/mysql/test_3306/mysql.sock --single-transaction --force --databases tpcc > v1.sqlP 2:[ 21:56:54-root@ssdtest:~ ]#mysqldump -S /data/mysql/test_3306/mysql.sock --single-transaction --force tpcc > v2.sql加了参数【--databases】在dump文件里会多了一个【use dbname】操作,这将导致相同实例同名数据库无辜惨遭"恢复出厂设置" :-)线上操作必须列出执行方案,
巧妙避开MySQL字符集的骚扰
在执行开发童鞋给的SQL脚本更新时,切记先用【\s】看下字符集,笔者今天在新项目上线时忘了确认字符集,导致页面查出来是乱码,还好老大给力,速度帮我背了黑锅,存底警醒自己以后不要再干出这种蠢事。Good Luck!
MySQL Schema设计(五)用Python管理字符集
一提字符集,可能有人会说,不管天崩地裂,全用utf8,整个世界都清净了。但某些字符集是需要更多CPU、消费更多的内存和磁盘空间、甚至影响索引使用,这还不包括令人蛋碎的乱码。可见、我们还是有必要花点时间略懂下MySQL字符集。先直观认识各阶梯下显示使用字符集:# 囊括三个层级:DB、Table、Column mysql> create database d charset utf8; Query OK, 1 row affected (0.04 sec) mysql> cr
MySQL Schema设计(三)利用Python操作Schema
弓在箭要射出之前,低声对箭说道,“你的自由是我的”。Schema如箭,弓似Python,选择Python,是Schema最大的自由。而自由应是一个能使自己变得更好的机会。㈠ MySQLdb部分表结构:mysql> use sakila; mysql> desc actor; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------
MySQL Schema设计(二)精打细算,油盐不断
茹志鹃在《妯娌》中说,“再看红英自己,那是连半个钟头的工都不肯耽误的,也从没见她吃过一口零食,一看就知道是个会精打细算、会过日子的人。”曾有人调侃,已婚身份最是适合DBA,毕竟,不当家不知柴米贵,年底的资源容量订购,那一分钱都是心头肉啊,会吃的吃千顿,不会吃的吃一顿。而且,故障诊断以及性能调优时,OS层的APP直接拖垮DB的案例也是家珍如数啊
MySQL ALTER TABLE: ALTER vs CHANGE vs MODIFY COLUMN
写作背景MySQL的ALTER TABLE操作常令DBA闻而变色,即使有Percona的OSC保驾护航,依然不堪轻易出手,但不是所有的ALTER TABLE都会引起表重建,从而需要花费数个小时甚至数天才能完成,本文对这3者作出简单区别,希望在万不得已时能是最后的一根稻草。ALTER COLUMN语法:ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}作用:设置或删除列的默认值。该操作会直接修改.frm文件而不涉及表
MySQL数据一致性检查工具
数据的不一致常令DBA被客服或业务部门投诉,那么一致性便是耳根清净[虽然不能这么说]的良方这里介绍MySQL官方的mysqldbcompare(python写的)和percona公司的pt-table-checksum(perl写的)mysqldbcompare的作用是对比两个数据库的表结构、表数据的一致性并能生成对应补偿的SQL,如主备、线上线下对于差异的展现能通过参数--difftype调控① unified (default)② context③ differ④ sql例子mysql> select * from
MySQL varchar计算:求列的数目和计算N的最大值
有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少?先明白计算的一些规则限制① 存储限制 需要额外地在长度列表上存放实际的字符长度:小于255为1个字节,大于255则要2个字节② 编码限制 gbk:每个字符最多占用2个字节 utf8:每个字符最多占用3个字节③ 长度限制 MySQL定义行的长度不能超过65535,这个限制了
大文件跨网传输技巧
运维DBA跨网传输大文件就如同上茅厕下厨房一般无二 好的方法并非显而易见,且方法的优劣差异可能非常显著 常言道:蔬菜最后一公里价格翻一翻,即便不听常言 我们用迅雷下载常常驻足在99.9%,亦可窥见文件校验的昂贵 整个传输需要综合考量的因素颇多,这里我仅拿是否压缩来写
突破MySQL视图限制:获取创建视图的SQL语句
视图本质上只是一条SQL语句而已、但令人蛋疼的是MySQL并没有把该SQL语句存储下来 而是像对待表一样、把视图的定义用文件的形式保存、以 .frm 存在 那么用show create view 显示的SQL将非常不友好 下面介绍一种方法来突破这种限制创建视图: mysql> create view v_t as select id from t where id=2; Query OK, 0 rows affected (0
MySQL 大DML操作建议
㈠ 大数据量INSERT ⑴ 使用多行插入代替单行:insert into t values (),(),(),... ⑵ LOAD DATA INFILE ... INTO TABLE t ⑶ 写入临时表、在 INSERT ... SELECT ⑷ 取消索引、约束,等数据加载完后在重建 ⑸ INSERT时指定DELAYED属性 &nb
Linux UDEV和为MySQL InnoDB共享表空间配置裸设备
⑴ UDEV 基础 udev 可管理保存在/dev 目录下的文件、文件只有在接入相应设备后才会生成、设备被拔出后自动删除 它还允许用户添加规则、以便修改/dev中默认的名称和权限、规则保存在/etc/udev/rules.d/目录下 ⑵ MySQL 绑定裸设备 只有InnoDB可以用裸设备 优点:绕过了文
略懂 MySQL字符集
本文虽说旨在明白、但若略懂亦可、毕竟诸葛孔明如是 只有基于字符的值才有所谓字符集的概念 某些字符集可能需要更多CPU、消费更多的内存和磁盘空间、甚至影响索引使用 这还不包括令人蛋碎的乱码、 可见、我们还是有必要花点时间略懂下MySQL字符集 先直观认识各阶梯
浅析MySQL 7 种日志
㈠ 错误日志 ① 参数 log_error:指定日志的位置和名称 ② 作用 ⑴出错/告警信息 ⑵优化帮助 &
InnoDB 主键的选择:自增ID & 业务ID
这里给个简单的经验、但不总是有效 -_-# ① 写操作较多:自增ID ② 读操作较多:业务IDBy David Lin2013-06-14Good Luck