标签: innodb

当交易试图控制它已经持有的锁时,死锁问题

我发现了一个非常令人困惑的死锁情况,我需要帮助才能理解.

有两个事务正在进行:
(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)

mysql deadlock innodb transactions

14
推荐指数
1
解决办法
7990
查看次数

澄清InnoDB引擎中的行级锁定与MySQL数据库中MyISAM引擎中的表级锁定之间的区别

我们假设有两个用户尝试按以下顺序访问数据库中名为"comments"的表:

  1. User1正在为id = 10的记录进行更新

    更新注释SET comment ="Hello World"WHERE id = 10

  2. User2正在为同一个表注释的所有行进行选择

    SELECT*FROM评论

我想讨论以下案例之间的区别:

  1. 如果表的引擎是MyISAM:Update查询将锁定整个表,该表将对select查询进行排队,直到行的更新完成,然后执行该表将阻止任何用户从该表中询问任何内容,直到更新为止.完了.
  2. 如果表的引擎是InnoDB:更新查询将锁定更新的行.

我想知道这个锁是如何影响选择查询的?

我的意思是,如果选择向数据库询问注释表的整个记录​​,并发现其中一个(id = 10)被锁定,数据库是否会再次对选择查询进行排队,直到更新完成?

如果是,那两个引擎之间有什么区别?

如果不是我想说我的网站上面有相同的情况,甚至我将我的表引擎从MyISAM更改为InnoDB,但是当有更新或插入查询时仍然出现排队任何请求的问题.

对这种情况的任何解释都会非常有用.先感谢您

mysql sql database performance innodb

14
推荐指数
1
解决办法
4643
查看次数

MySQL过多的内存使用量

我安装了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 memory innodb

14
推荐指数
1
解决办法
7135
查看次数

mysql_upgrade失败 - innodb表不存在?

我正在将我的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)

mysql innodb docker mysqlupgrade

14
推荐指数
2
解决办法
3万
查看次数

使用mysqldump转储和加载MySQL InnoDB数据库的最快方法是什么?

我想用mysqldump和MySQL 5.1创建一个包含大约40个InnoDB表和大约1.5GB数据的数据库副本.

什么是最佳参数(即: - single-transaction)将导致最快的数据转储和加载?

同样,在将数据加载到第二个数据库时,是否更快:

1)将结果直接传递给第二个MySQL服务器实例并使用--compress选项

要么

2)从文本文件加载它(即:mysql <my_sql_dump.sql)

mysql database backup innodb

13
推荐指数
2
解决办法
1万
查看次数

什么时候应该选择在MySQL中使用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)) 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)

mysql innodb

13
推荐指数
2
解决办法
2万
查看次数

MySQL索引比存储的数据大

我有一个包含以下统计数据的数据库

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)

mysql database indexing optimization innodb

13
推荐指数
2
解决办法
8676
查看次数

MySQL INSERT .... ON DUPLICATE UPDATE - 在自动增量中添加一个

我通过简单的点击计数器跟踪访问我的所有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)

php mysql innodb

13
推荐指数
2
解决办法
5858
查看次数

插入InnoDB/MyISAM记录所需时间的差异

我将记录插入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结果

所以MyISAM增加和InnoDB或多或少不变.

谁能解释这些差异?与表中的记录数量有关?为什么这些异常值与InnoDB?

配置二手电脑:

  • Windows XP SP3
  • 英特尔酷睿2双核处理器
  • 3.00 Ghz
  • 2 GB RAM
  • MySQL 5.5 CE

更新:我应该提到我在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)

mysql database performance myisam innodb

13
推荐指数
1
解决办法
1209
查看次数

InnoDB表优化没有锁定表

我注意到,如果我在一段时间后重新打包一个表(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)

mysql innodb

13
推荐指数
2
解决办法
2万
查看次数