我们已将站点转移到新服务器,现在它已经运行了三天,没有任何外键处于活动状态。
我怎么能够:
我准备了以下SQL语句来比较MyISAM、InnoDB和TokuDB的性能行为(INSERT执行100000次):
MyISAM:
CREATE TABLE `testtable_myisam` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `testtable_myisam` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000));
Run Code Online (Sandbox Code Playgroud)
索引数据库:
CREATE TABLE `testtable_innodb` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `testtable_innodb` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000));
Run Code Online (Sandbox Code Playgroud)
德库数据库:
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 在 MySQL 中(或者我应该说:使用 MySQL 的 InnoDB 引擎)-如何表示空值?即如果允许列具有NULLs ,表(或单个记录,如果它在记录级别)的表示如何更改?
如果不同的列数据类型不同 - 要么解释表示 NULL 的各种方法,要么只选择一种数据类型(例如INT)。
我有可重复读取的隔离级别,并且正在执行:
Select * From example查询。我在https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html中读到, select...from 查询使用来自快照的一致读取,因此不对行或表设置锁定。这是否意味着,即使修改不会显示在选择结果中,在选择之后但选择查询结束之前启动的更新、插入或删除仍然能够运行?
我有一个现有的表,它使用自动增量id作为其主键。
表中有 id 从 1 开始的条目:
id field1
== ======
1 foo1
2 foo2
3 foo3
Run Code Online (Sandbox Code Playgroud)
有没有办法更新id所有现有条目,以便 auto_increment 从另一个数字开始?:
id field1
==== ======
1000 foo1
1001 foo2
1002 foo3
Run Code Online (Sandbox Code Playgroud)
(如果不可能,则不一定必须保留订单)
在 mysql 中创建线程安全序列时,我遇到了 mysql 文档 - https://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id,建议创建这样的序列 -
1. mysql> CREATE TABLE sequence (id INT NOT NULL);
2. mysql> INSERT INTO sequence VALUES (0);
3. mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
4. mysql> SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)
我的问题不是步骤 4,为什么我每次需要获取新 id 时不能直接查询序列表来获取 id?像这样 - SELECT id FROM 序列;直接查询序列表与文档中建议的 LAST_INSERT_ID 相比是否有任何缺点?
我的 mysql 实现看起来像这样 -
CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
DELIMITER //
CREATE PROCEDURE nextVal(OUT nextval INT)
BEGIN
UPDATE sequence SET id=LAST_INSERT_ID(id+1);
SELECT id into nextval FROM …Run Code Online (Sandbox Code Playgroud) 我似乎\xe3\x80\x80有一个错误的想法:
\n\nupdate table_name set id=222 where id >333;\nRun Code Online (Sandbox Code Playgroud)\n\n我的旧观点是上面的单个sql没有begin并且commit不会启动事务。\n但这似乎是错误的。
但是当我阅读mysql文档时,我发现似乎所有sql都会在一个事务中。如果你不显式使用beginand commit,它将在InnoDB中隐式启动事务。
\n\n\n在 InnoDB 中,所有用户活动都发生在事务内。如果启用自动提交模式,则每个 SQL 语句都会自行形成一个事务。默认情况下,MySQL 在启用自动提交的情况下为每个新连接启动会话,因此如果该语句未返回错误,MySQL 会在每个 SQL 语句后执行提交。如果语句返回错误,则提交或回滚行为取决于错误。请参见第 14.21.4 节,\xe2\x80\x9cInnoDB 错误处理\xe2\x80\x9d。
\n
是所有的sql都会在事务中执行,无论你是否使用begin和commit显式。
我们的环境之一中有一个 MySQL innodb 集群。集群中的一个节点崩溃了。但是,我们能够使崩溃的节点联机,但无法将其加入集群。
有人可以帮助恢复/恢复节点并将其加入集群。我们尝试使用“dba.rebootClusterFromCompleteOutage()”,但没有帮助。
配置:MySQL 5.7.24社区版,CentOS 7,标准三节点innodb集群
集群状态:
MySQL NODE02:3306 ssl JS > var c=dba.getCluster()
MySQL NODE02:3306 ssl JS > c.status()
{
"clusterName": "QACluster",
"defaultReplicaSet": {
"name": "default",
"primary": "NODE03:3306",
"ssl": "REQUIRED",
"status": "OK_NO_TOLERANCE",
"statusText": "Cluster is NOT tolerant to any failures. 1 member is not active",
"topology": {
"NODE02:3306": {
"address": "NODE02:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"NODE03:3306": {
"address": "NODE03:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"NODE01:3306": {
"address": "NODE01:3306", …Run Code Online (Sandbox Code Playgroud) 我们有一个 MySQL Master,运行在 1TB SSD 上,带有 500GB 数据库。正如您从下面的屏幕截图中看到的,我们的空间已经用完了,因为ibtmp1它变得太大了。现在是194GB。
MySQL手册说:
“当数据文件达到最大大小时,查询将失败并显示错误,表明表已满。”
因此我们有两个担忧:
我确信手册有误导性或者我们有误解,因为MySQL的默认设置不可能允许它填满磁盘然后失败?
我想将数据库中所有表的 row_format 更改为动态。选择数据库后,我可以执行“ALTER TABLE tablenameROW_FORMAT=DYNAMIC;” 手动进行。不幸的是,大约有 100 张桌子需要更换。
如何将特定数据库中与 DYNAMIC 不同的每个表的行格式更改为动态?
我一直在尝试,但找不到有效的解决方案。
innodb ×10
mysql ×10
mariadb ×2
sql ×2
alter-table ×1
database ×1
foreign-keys ×1
myisam ×1
temp-tables ×1
tokudb ×1
transactions ×1