正文
背景
今天遇到一个得很奇怪的问题.
Mysql一个运行时间很长的select阻塞了对select里面左连接表做create index 操作的SQL
当时感觉不应该, 一直以为读锁不会与独占更新锁互斥.
经过与公司数据库大牛沟通, 得出结论如下:
在mysql做ddl语句的时候一定要特别小心
select语句会执有表的MDL_SHARED_READ(SR)锁,
而DDL语句在opening tables阶段会需要MDL_SHARED_NO_WRITE(SNW)锁,
在RENAME阶段更会需要MDL_EXCLUSIVE锁(X),而SR锁与X锁是互斥的。
mysql采用online ddl解决。
复制
感悟
数据结构是产品里面非常核心的内容
需要有优秀的设计和良好的扩展性.
理论上不能随意进行数据结构的修改.
数据库表的索引必须有意义,不能随意设置.
非常不建议在发版中间修改数据库的数据结构.
更新会很慢, 也容易导致数据库不稳定,性能衰退.
不同数据库的限制,区别,性能表现差异非常巨大.
如果确定要支持一种数据库,必须有相应的专家团队来支持.
复制
MySQL-Show命令学习
mysql show命令可以获取数据库的很多特性,非常值得学习.
一个最简单的学习笔记:
1、查询数据库
SHOW DATABASES;
2、查询数据库中表
SHOW TABLES;
SHOW TABLES FROM db;
3、查询表索引
SHOW INDEX FROM table
4、查询表中的列
SHOW [FULL] COLUMNS FROM tb1 FROM db_test;
SHOW [FULL] COLUMNS FROM db_test.tb1;
5、显示当前使用或者指定的database中的每个表的信息
SHOW TABLE STATUS;
6、显示系统中正在运行的所有进程,也就是当前正在执行的查询
SHOW [FULL] PROCESSLIST
复制
MySQL-show命令学习-加强版1
show variables;
show processlist;
show table status;
show privileges;
show create database database_name;
show create table table_name;
show engies;
show innodb status;
show logs;
show warnings;
show errors;
复制
MySQL-mysqlshow命令
mysqlhow命令在使用rpm包安装mysql数据库时可能会自动个安装上.
可以如此查看
which mysqlshow 会发现一般安装再/bin/mysqlshow
可以使用 mysqlshow --help 的方式查看帮助:
一个简单的结果为:
-h:MySQL服务器的ip地址或主机名;
-u:连接MySQL服务器的用户名;
-p:连接MySQL服务器的密码;
--count:显示每个数据表中数据的行数;
-k:显示数据表的索引;
-t:显示数据表的类型;
-i:显示数据表的额外信息。
比如可以通过一个命令查看所有表的行数.
mysqlshow -h 10.110.136.37 -u root -p -k xxxx2103mysql --count >count.txt
一个比较简单的效果为:
Database: xxxx2103mysql
+---------------------------------+----------+------------+
| Tables | Columns | Total Rows |
+---------------------------------+----------+------------+
| accesspoint | 12 | 0 |
| admdivision | 7 | 0 |
| amactcacheindexfield | 8 | 2539 |
| amactcacheset | 22 | 15 |
复制
MySQL获取锁以及处理锁
可以通过show processlist 的方式获取进程信息
然后执行kill pid 的方式进行解锁
但是如果比较多 可能稍微复杂一些. 这个时候可以使用如下命令来处理.
使用 -e 命令的方式执行命令获取所有的连接信息
mysql -uroot -p -h 10.110.136.37 -e "show processlist" >process.list
然后可以执行命令
for i in `cat process.list |grep -i locked |awk '{print $1}'` ;
do
echo "kill $i ;" >>killprocess.sql ;
done
可以使用source 也可以使用 执行 执行就可以了.
复制