我发现了一个非常令人困惑的死锁情况,我需要帮助才能理解.
有两个事务正在进行:
(2)持有查询锁delete from myTable where id = NAME_CONST('p_id',10000).这是PRIMARY KEY的锁定,虽然不是完整的密钥而是范围.看起来这对我来说是一个完整的写锁定lock_mode X locks rec but not gap.
(1)正在等待同样的锁,也用于查询delete from myTable where id = NAME_CONST('p_id',10000).
(2)也试着去获取此锁并且MySQL检测到死锁.
我无法理解的是为什么(2)必须再次获取锁,因为它已经拥有它并且它在所有情况下都是写锁(lock_mode X).
它看起来也像是完全相同的查询.
这是表定义
create myTable (
id int unsigned not null,
value1 char(8) not null,
value2 int unsigned,
primary key (id, value1)
);
Run Code Online (Sandbox Code Playgroud)
这是来自的信息 SHOW ENGINE INNODB STATUS\G
------------------------
LATEST DETECTED DEADLOCK
------------------------
130313 14:46:28
*** (1) TRANSACTION:
TRANSACTION 75ACB8A3, ACTIVE 0 sec, process no 6110, OS thread id …Run Code Online (Sandbox Code Playgroud) 我们假设有两个用户尝试按以下顺序访问数据库中名为"comments"的表:
User1正在为id = 10的记录进行更新
更新注释SET comment ="Hello World"WHERE id = 10
User2正在为同一个表注释的所有行进行选择
SELECT*FROM评论
我想讨论以下案例之间的区别:
我想知道这个锁是如何影响选择查询的?
我的意思是,如果选择向数据库询问注释表的整个记录,并发现其中一个(id = 10)被锁定,数据库是否会再次对选择查询进行排队,直到更新完成?
如果是,那两个引擎之间有什么区别?
如果不是我想说我的网站上面有相同的情况,甚至我将我的表引擎从MyISAM更改为InnoDB,但是当有更新或插入查询时仍然出现排队任何请求的问题.
对这种情况的任何解释都会非常有用.先感谢您
我安装了MySQL,它分配的内存比我预期的多得多.我想了解修复根本原因的地方.
要估计RAM使用率,我使用以下公式:
key_buffer_size + query_cache_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + Max_used_connections * (read_buffer_size + read_rnd_buffer_size + sort_buffer_size+ join_buffer_size+ binlog_cache_size + thread_stack + tmp_table_size)
Run Code Online (Sandbox Code Playgroud)
该公式产生约5.3 GB的估计分配.相反,MySQL使用的RAM继续增长,经过几天的活动后,它远远超过9 GB(大量写入交换).
我忘记了什么?我如何理解谁在吃剩余的RAM?
还有一些信息.
我在RHEL6.3 64位上运行MySQL CE 5.6.17.我的服务器有6 GB RAM和8GB交换空间.我一直有大约150个与MySQL有关的活动连接,但是我将max_connections保持在更高的值以适应峰值,并预见到这台机器上会有更多的流量.我只使用InnoDB.我的应用程序使用池连接到池.生成器打开连接并在完成后将它们释放到池中.我已经测量过我总是有几个并行请求,并且池化可以加快一点连接创建速度(因此查询速度更快).池(DBCP)自动调整合理数量的活动连接,通常约为100-150.我已经尝试过了:
- 杀死连接不会释放RAM
- FLUSH TABLES不释放RAM
按照我的配置:
---- my.cnf -----
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 64M
max_allowed_packet = 1M
table_open_cache = 256
key_buffer_size = 128M
sort_buffer_size = 524288
read_buffer_size = 131072
read_rnd_buffer_size = 524288 …Run Code Online (Sandbox Code Playgroud) 我正在将我的mysql-5.5 docker容器数据库升级到mysql-5.6 docker容器.我能够解决所有其他问题.最后我的服务器运行5.6.但是当我运行mysql_upgrade时,我收到以下错误.
错误:
root@17aa74cbc5e2# mysql_upgrade -uroot -password
Warning: Using a password on the command line interface can be insecure.
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/var/run/mysqld/mysqld.sock'
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/var/run/mysqld/mysqld.sock'
Warning: Using a password on the command line interface can be insecure.
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.help_category OK …Run Code Online (Sandbox Code Playgroud) 我想用mysqldump和MySQL 5.1创建一个包含大约40个InnoDB表和大约1.5GB数据的数据库副本.
什么是最佳参数(即: - single-transaction)将导致最快的数据转储和加载?
同样,在将数据加载到第二个数据库时,是否更快:
1)将结果直接传递给第二个MySQL服务器实例并使用--compress选项
要么
2)从文本文件加载它(即:mysql <my_sql_dump.sql)
我对这里的伤害感到困惑.
我知道怎么做,见下文,但不知道为什么?它们适用于什么?
create table orders (order_no int not null auto_increment, FK_cust_no int not null,
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB;
create table orders (order_no int not null auto_increment, FK_cust_no int not null,
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no));
Run Code Online (Sandbox Code Playgroud) 我有一个包含以下统计数据的数据库
Tables Data Index Total
11 579,6 MB 0,9 GB 1,5 GB
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到指数接近2倍.并且有一个表约有700万行占据了至少99%.
我也有两个非常相似的索引
a) UNIQUE KEY `idx_customer_invoice` (`customer_id`,`invoice_no`),
b) KEY `idx_customer_invoice_order` (`customer_id`,`invoice_no`,`order_no`)
Run Code Online (Sandbox Code Playgroud)
更新:这是最大表的表定义(至少在结构上)
CREATE TABLE `invoices` (
`id` int(10) unsigned NOT NULL auto_increment,
`customer_id` int(10) unsigned NOT NULL,
`order_no` varchar(10) default NULL,
`invoice_no` varchar(20) default NULL,
`customer_no` varchar(20) default NULL,
`name` varchar(45) NOT NULL default '',
`archived` tinyint(4) default NULL,
`invoiced` tinyint(4) default NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`group` int(11) default NULL,
`customer_group` …Run Code Online (Sandbox Code Playgroud) 我通过简单的点击计数器跟踪访问我的所有http_user_agents.下面在数据库中插入http_user_agent,此字段为Case Insensitive且为Unique.因此,当我们尝试插入它并找到DUPLICATE KEY时,它会向hits字段添加1.
问题是我的自动增量字段仍然增加,即使我们没有插入字段.我怎么能阻止这个?
$sql = "INSERT INTO `db_agency_cloud`.`tblRefHttpUsersAgent` SET `http_users_agent` = :UsersAgent, `created_ts` = NOW() ON DUPLICATE KEY UPDATE `hits` = `hits` + 1";
Run Code Online (Sandbox Code Playgroud)
这是表结构:
CREATE TABLE `tblRefHttpUsersAgent`
(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`http_users_agent` varchar(255) NOT NULL,
`hits` int(20) unsigned NOT NULL DEFAULT '1',
`created_ts` datetime NOT NULL,
`activity_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `http_users_agent` (`http_users_agent`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Run Code Online (Sandbox Code Playgroud) 我将记录插入MySQL表,并尝试了解MyISAM表和InnoDB表之间的时间差异.
这是创建表的代码:
CREATE TABLE SpectrumData (
ID INT(11) NULL DEFAULT NULL,
`Set` INT(11) NULL DEFAULT NULL,
Wavelength DOUBLE NULL DEFAULT NULL,
Intensity DOUBLE NULL DEFAULT NULL,
Error INT(11) NULL DEFAULT NULL,
`Status` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=xxx
ROW_FORMAT=DEFAULT
Run Code Online (Sandbox Code Playgroud)
我插入10000条记录,以秒为单位测量所需时间并重复100次.我把结果放在两个Excel图表中:

所以MyISAM增加和InnoDB或多或少不变.
谁能解释这些差异?与表中的记录数量有关?为什么这些异常值与InnoDB?
配置二手电脑:
更新:我应该提到我在Access前端应用程序中插入带有VBA脚本的记录.我通过ODBC系统DSN连接到MySQL数据库.
VBA代码:
Dim RsSpectrumData As DAO.Recordset
Dim Db As Database
Dim i As Integer
Dim j As Integer
Dim TimerStart
Set Db = CurrentDb …Run Code Online (Sandbox Code Playgroud) 我注意到,如果我在一段时间后重新打包一个表(ALTER TABLE foo ENGINE = INNODB),或者在INSERT/UPDATE/DELETE大量之后重新打包,我会注意到大量的性能提升.我不知道这是因为指标等是重建,还是压缩表空间或其他什么?
让我觉得做ALTER TABLE foo ENGINE = INNODB之类的东西应该是例程表维护的一部分,但是使用OPTIMIZE或ALTER锁定表是不可接受的,有一个很好的方法可以处理一个数据库服务器(意思是没有失败到另一个实例)没有锁定整个表?
更新:使用Percona 5.5.17-55
更新:SHOW VARIABLES喜欢'innodb%';
+----------------------------------------+------------------------+
| Variable_name | Value |
+----------------------------------------+------------------------+
| innodb_adaptive_checkpoint | estimate |
| innodb_adaptive_flushing | OFF |
| innodb_adaptive_hash_index | ON |
| innodb_additional_mem_pool_size | 8388608 |
| innodb_auto_lru_dump | 120 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_buffer_pool_shm_checksum | ON |
| innodb_buffer_pool_shm_key | 0 |
| innodb_buffer_pool_size | 30064771072 |
| innodb_change_buffering | inserts | …Run Code Online (Sandbox Code Playgroud) innodb ×10
mysql ×10
database ×4
performance ×2
backup ×1
deadlock ×1
docker ×1
indexing ×1
memory ×1
myisam ×1
mysqlupgrade ×1
optimization ×1
php ×1
sql ×1
transactions ×1