如何查询mysql事务未提交
注意这篇文章并非死锁的,而是锁等待
到information_schema库下面,查看下面这个表:
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。
我们来演示下。
线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。
mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> use test;
Reading table information for completion oftableandcolumn names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| demo_test |
| t3 |
+—————-+
2 rowsinset (0.00 sec)
By admin
read moremysql中的handler_read_%
mysql> show status like ‘handler_read_%’;
+———————–+——-+
| Variable_name | Value |
+———————–+——-+
| Handler_read_first | 1 |
| Handler_read_key | 1 |
| Handler_read_last | 0 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 21 |
+———————–+——-+
7 rows in set (0.01 sec)
如上所示,mysql中关于read的计数器,有7个。他们的数值对于系统的状况的了解,对于系统的调优都十分重要。我们应该理解他们的含义。本文是自己的一些理解。 首先7个计数器,我们应该分为两部分: 1)对索引读的计数器:前面的5个都是对索引读情况的计数器, Handler_read_first:是指读索引的第一项(的次数); Handler_read_key:是指读索引的某一项(的次数); Handler_read_next:是指读索引的下一项(的次数); Handler_read_last:是指读索引的最后第一项(的次数); Handler_read_prev:是指读索引的前一项(的次数); 5者应该有四种组合:
- Handler_read_first 和 Handler_read_next 组合应该是索引覆盖扫描
- Handler_read_key 基于索引取值
- Handler_read_key 和 Handler_read_next 组合应该是索引范围扫描
- Handler_read_last 和 Handler_read_prev 组合应该是索引范围扫描(orde by desc)
2)对数据文件的计数器:后面的2个都是对数据文件读情况的计数器, Handler_read_rnd: The number of requests to read a row based on a fixed position. This value is high if you are doing a lot of queries that require sorting of the result. You probably have a lot of queries that require MySQL to scan entire tables or you have joins that do not use keys properly.
By admin
read moregitlab修改时区
刚装的系统,默认时间是UTC,比北京时间少了8个小时.
修改 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml 配置文件中的 time_zone : ‘Beijing’
重启gitlab 即可
#gitlab-ctl restart
By admin
read more使用Gitlab一键安装包后的日常备份恢复与迁移
Gitlab 创建备份
使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份:
gitlab-rake gitlab:backup:create
使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1393513186_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1393513186是备份创建的日期.
Gitlab 修改备份文件默认目录
你也可以通过修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:
gitlab_rails['backup_path'] = '/mnt/backups'
/mnt/backups修改为你想存放备份的目录即可, 修改完成之后使用gitlab-ctl reconfigure命令重载配置文件即可.
Gitlab 自动备份
也可以通过crontab使用备份命令实现自动备份:
sudo su -
crontab -e
加入以下, 实现每天凌晨2点进行一次自动备份:
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
Gitlab 恢复
同样, Gitlab的从备份恢复也非常简单:
# 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 从1393513186编号备份中恢复
gitlab-rake gitlab:backup:restoreBACKUP=1393513186
# 启动Gitlab
sudo gitlab-ctl start
Gitlab迁移
迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话). 但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.
其他
最新版本的Gitlab已经修复了HTTPS设备的BUG, 现在使用 官方HTTPS配置 即可轻松启用HTTPS.
By admin
read more[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by的解决办法
线上用的MySQL版本为5.7.11,线下用的5.6版本,发现将程序上线后,有些地方报这个错误
[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,若select中的列没有在group by中出现,那么这句SQL是不合法的。
解决办法下my.cnf中添加以下几行
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
在sql_mode 中去掉only_full_group_by
然后重启MySQL Server即可。
此ONLY_FULL_GROUP_BY的解释: http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
==========================================
mysql> SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by
If you know that, for a given data set, each name value in fact uniquely determines the address value, address is effectively functionally dependent on name. To tell MySQL to accept the query, you can use the ANY_VALUE(){.link} function:
By admin
read moreLinux下安装MySQL多实例
环境说明: Centos 6.6 64位 mysql 使用最新版本5.7.16版本
这里安装两个MySQL实例,分别使用3306/3307端口号
目录结构: /data/mysql/mysql3306 /data/mysql/mysql3306/data /data/mysql/mysql3307/log /data/mysql/mysql3306/tmp
执行命令:
mkdir -p /data/mysql/mysql3306/{data,tmp,log}
mkdir -p /data/mysql/mysql3307/{data,tmp,log}
为了方便我们先配置mysql3306实例,配置成功后,再复制一份到3307即可。
tar zxvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz
cp -rf mysql-5.7.16-linux-glibc2.5-x86_64/* /data/mysql/mysql3306/
权限修改
chown -R mysql:mysql /data/mysql/mysql3306
配置my.cnf
cd /data/mysql/mysql3306
cp support-files/my-default.cnf ./my.cnf
编辑/data/mysql/mysql3306/my.cnf 内容如下:
[client]
port=3306
[mysqld]
basedir=/data/mysql/mysql3306
datadir=/data/mysql/mysql3306/data
socket=/data/mysql/mysql3306/tmp/mysql.sock
port=3306
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/data/mysql/mysql3306/log/mysqld.log
pid-file=/data/mysql/mysql3306/mysqld.pid
初始化表,并生成一个随机root密码
bin/mysqld --initialize --basedir=/data/mysql/mysql3306 --datadir=/data/mysql/mysql3306/data
2016-12-03T13:33:57.097171Z 1 [Note] A temporary password is generated for root@localhost: y+_;!l#uh3TK
启用mysql 实例
By admin
read morePercona XtraBackup备份mysql数据库 技术手册
https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
下载地址: https://www.percona.com/downloads/XtraBackup/LATEST/ 一、安装两个必需库
sudo yum -y install libdv perl-DBD-MySQL
如果libev库在yum源找不到的话,需要在rpmfind.net网站下载自行安装。
wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm
rpm libev-4.15-1.el6.rf.x86_64.rpm
二、安装percona-xtrabackup
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.5/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.5-1.el6.x86_64.rpm
rpm -ivh percona-xtrabackup-24-2.4.5-1.el6.x86_64.rpm
https://yq.aliyun.com/articles/59272 https://my.oschina.net/lionel45/blog/691406 http://blog.itpub.net/29418060/viewspace-1676617/
By admin
read morelinux screen 命令详解
一、背景
系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
二、简介
GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
会话恢复 : 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
多窗口 : 在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
会话共享 : Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
GNU’s Screen 官方站点: http://www.gnu.org/software/screen/
三、语法
# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
参数说明
-A 将所有的视窗都调整为目前终端机的大小。 -d <作业名称> 将指定的screen作业离线。 -h <行数> 指定视窗的缓冲区行数。 -m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。 -r <作业名称> 恢复离线的screen作业。 -R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。 -s 指定建立新视窗时,所要执行的shell。 -S <作业名称> 指定screen作业的名称。 -v 显示版本信息。 -x 恢复之前离线的screen作业。 -ls或–list 显示目前所有的screen作业。 -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
四、常用screen参数
screen -S yourname -> 新建一个叫yourname的session screen -ls -> 列出当前所有的session screen -r yourname -> 回到yourname这个session screen -d yourname -> 远程detach某个session screen -d -r yourname -> 结束当前session并回到yourname这个session
By admin
read moreMySQL高可用架构几种方案
MySQL高可用架构之MHA http://www.cnblogs.com/gomysql/p/3675429.html
基于PXC的MySQL高可用架构探索 http://www.infoq.com/cn/presentations/mysql-high-availability-architecture-exploration-based-on-pxc
By admin
read moreLaravel中的异常处理
Eloquent try/catch on duplicate key Exception and delete?
I’ve a form for a new vendor where the controller listens for its POST. From there on I’m creating a new endor and the equivalential login for this vendor.
Controller :
$vendor = Vendor::create( $request->all() );
$login = Vendor::createLogin($vendor->vendor_id);
the createLogin function :
public static function createLogin($lid){
$name = self::find($lid)->vendor_name;
$name = explode(' ', $name);
$vendor_login = [
'username' => strtolower( end($name) ) . '.vendor',
'group' => 'vendor'
];
try{
$user = User::create( $vendor_login );
return $user;
}
catch (Illuminate\Database\QueryException $e){
$error_code = $e->errorInfo[1];
if($error_code == 1062){
self::delete($lid);
return 'houston, we have a duplicate entry problem';
}
}
Creating a new, nonexistant one : works perfectly. However the try/catch block never seems to be reached since I’m always getting laravels inbuild error site with the QueryException for the duplicate entry on the users table. How can I make it work, that on a duplicate entry it deletes the vendor it set before from the table Vendor AND returns an error to display for the user?
By admin
read moreMySQL的InnoDB引擎强烈建议使用自增主键的原因
1)InnoDB使用聚集索引,数据记录本身被存于主索引的叶子节点上,这就要求同一个叶子节点内的各条数据记录按主键顺序存放,因此每当一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子,则开辟一个新的页(节点)。
如果表使用自增主键,那么每次插入新的记录时,记录就会顺序添加到当前索引节点后续位置,当一页写满,就会自动开辟一个新的页。这样就就会形成一个紧凑的索引结构,近似顺序填满,由于每次插入时也不需要移动所有数据,因此效率很高,也不会增加很多额外的开销维护索引。
如果使用非自增主键,由于每次插入主键的值近乎于随机,因此每次新纪录都要被插到现有索引页的中间某个位置,此时MySQL不得不为了将新纪录插到合适位置而移动数据,甚至目标页面可能已经被写到磁盘而从缓存中清除,这增加了很多额外开销,同时频繁的移动,分页造成了大量的碎片,得到不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建并优化填充页面。
2)由于MySQL从磁盘读取数据时一块一块来读取的,同时,根据局部性原理,MySQL引擎会选择预读一部分和你当前读数据所在内存相邻的数据块,这个时候这些相邻数据块的数据已经存在于内存中。由于数据库大部分是查询操作,这个时候,如果主键是自增的话,数据存储都是紧凑地存储在一起的,那么对于局部性原理利用和避免过多地I/O操作都有着巨大的促进作用
By admin
read more
