我有一个带有两个外键约束的表,如下所示:
mysql> SHOW CREATE TABLE `user`;
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`region_id` int(11) unsigned DEFAULT NULL,
`town_id` int(11) unsigned DEFAULT NULL,
`fullname` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`username` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`password` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`active` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `FK_G38T6P7EKUXYWH1` (`region_id`),
KEY `FK_J8VWK0ZN7FD2QX4` (`town_id`),
CONSTRAINT `FK_G38T6P7EKUXYWH1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE NO ACTION,
CONSTRAINT `FK_J8VWK0ZN7FD2QX4` …
Run Code Online (Sandbox Code Playgroud) 我的另一个问题仅与&
字符串类型有关。这个问题是关于用B''
或构造的二进制字符串文字X''
。
MariaDB 支持二进制和十六进制文字,
SELECT X'01', B'00000001', X'01' = B'00000001';
| X'01' | B'00000001' | X'01' = B'00000001' |
+-------+-------------+---------------------+
| X | X | 1 |
* Using `X` because StackExchange strips the non-printable character.
Run Code Online (Sandbox Code Playgroud)
然而,有趣的是,当我通过二元运算符传递它们时,它们并不相同
SELECT X'01' & B'00000001', X'01' & X'01', B'00000001' & B'00000001';
| X'01' & B'00000001' | X'01' & X'01' | B'00000001' & B'00000001' |
+---------------------+---------------+---------------------------+
| 0 | 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
所以,如果他们是位字符串处理它没有任何意义(因为其结果应该是1
,如果他们作为字符串处理,因为实际的字符串,它是没有意义的 …
如何重启 MariaDB Galera 集群?
在所有节点都崩溃后,我尝试恢复集群但没有成功。我只有2个节点。
正如文档所说,我在其中一个节点上设置了一个参数:
set global wsrep_provider_options="pc.bootstrap=true";
Run Code Online (Sandbox Code Playgroud)
然后尝试启动第一个节点:
systemctl start mariadb
Run Code Online (Sandbox Code Playgroud)
之后我收到一个错误:
Oct 11 16:11:12 proxy1 sh[2367]: 2016-10-11 16:11:12 140291677038720 [Note] /usr/sbin/mysqld (mysqld 10.1.18-MariaDB) starting as process 2402 ...
Oct 11 16:11:15 proxy1 sh[2367]: WSREP: Recovered position b6c1dc93-8fa7-11e6-933e-e64cd44e3be0:141
Oct 11 16:11:15 proxy1 mysqld[2434]: 2016-10-11 16:11:15 140047023368320 [Note] /usr/sbin/mysqld (mysqld 10.1.18-MariaDB) starting as process 2434 ...
Oct 11 16:11:15 proxy1 mysqld[2434]: 2016-10-11 16:11:15 140047023368320 [Note] WSREP: Read nil XID from storage engines, skipping position init
Oct 11 16:11:15 proxy1 …
Run Code Online (Sandbox Code Playgroud) 我崩溃了我所有的 3 个节点。启动所有节点后,我注意到 mariadb 已死。我无法再次运行它。
我在所有服务器上使用 CentOS 7
我尝试启动第一个节点,然后再启动其他节点,但没有成功。
首先,我试图按照文档中的说明找到最新的 seqno。因此,我查看了所有 3 个节点上的此文件:/var/lib/mysql/grastate.dat
并注意到所有 3 个节点上的内容都相同(uuid 相同且 seqno 相同)!这是这个文件:
# GALERA saved state
version: 2.1
uuid: ec3e180d-bbff-11e6-b989-3273ac13ba57
seqno: -1
cert_index:
Run Code Online (Sandbox Code Playgroud)
好的。由于所有节点都是相同的,我可以将任何节点作为新节点运行并向其添加另一个节点。我使用了下一个命令:
galera_new_cluster
Run Code Online (Sandbox Code Playgroud)
它没有用。节点未启动。
这是我得到的:
-- Unit mariadb.service has begun starting up.
Dec 07 18:20:55 GlusterDC1_1 sh[4298]: 2016-12-07 18:20:55 139806456780992 [Note] /usr/sbin/mysqld (mysqld 10.1.19-MariaDB) starting as process 4332 ...
Dec 07 18:20:58 GlusterDC1_1 sh[4298]: WSREP: Recovered position ec3e180d-bbff-11e6-b989-3273ac13ba57:83
Dec 07 18:20:58 GlusterDC1_1 mysqld[4364]: 2016-12-07 18:20:58 139830894778560 [Note] /usr/sbin/mysqld (mysqld 10.1.19-MariaDB) …
Run Code Online (Sandbox Code Playgroud) 我们使用 MariaDB 10.1.19 托管旧数据库。我们有一个lpr
表(在 InnoDB 上),我们想在其中从文本列移动gate
到规范化外键gate_id
。我们的代码并行执行 UPDATE,如下所示:
UPDATE lpr SET gate_id=1 WHERE gate_id IS null AND gate LIKE '%[1]%'
UPDATE lpr SET gate_id=2 WHERE gate_id IS null AND gate LIKE '%[2]%'
UPDATE lpr SET gate_id=3 WHERE gate_id IS null AND gate LIKE '%[3]%'
UPDATE lpr SET gate_id=4 WHERE gate_id IS null AND gate LIKE '%[4]%'
...
Run Code Online (Sandbox Code Playgroud)
由于受所有 UPDATE 影响的行是不相交的,并且表位于 InnoDB 上,我们不会期望锁争用,但我们得到错误:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
对于所有更新。提高innodb_lock_wait_timeout
到100〜并不能改变什么,以及设置 …
MySQL 无法在 Arch Linux 上启动。
mysqld[3440]: [Note] /usr/bin/mysqld (mysqld 10.1.22-MariaDB) starting as process 3440 ...
mysqld[3440]: [Note] InnoDB: Using mutexes to ref count buffer pool pages
mysqld[3440]: [Note] InnoDB: The InnoDB memory heap is disabled
mysqld[3440]: [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
mysqld[3440]: [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
mysqld[3440]: [Note] InnoDB: Compressed tables use zlib 1.2.11
mysqld[3440]: [Note] InnoDB: Using Linux native AIO
mysqld[3440]: [Note] InnoDB: Using SSE crc32 instructions
mysqld[3440]: [Note] …
Run Code Online (Sandbox Code Playgroud) 当我启动时mysqladmin
,它会打印出一些统计信息,包括“每秒平均查询数”:
# mysqladmin --defaults-file=../mylogin.cnf status
Uptime: 4568115 Threads: 859 Questions: 3703806462 Slow queries: 19415 Opens: 10300505 Flush tables: 247 Open tables: 2000 Queries per second avg: 810.795
Run Code Online (Sandbox Code Playgroud)
我可以在 SQL 查询中检索“每秒平均查询数”值吗?我们使用 MariaDB 10.1.x
每次我重新启动 Mariadb 时,我的 max_connections 都会设置为 151,而在 my.cnf 中,我会设置为 300。为什么会发生这种情况?
我实际上很难理解这里的问题。我到处都看到说 UPDATE 受益于 WHERE 子句上的索引。
然而,这个查询,
UPDATE `documents` SET `read`="1" WHERE `docid` IN (<subquery>)
Run Code Online (Sandbox Code Playgroud)
似乎没有使用索引。该表documents
有一个索引 ondocid
和 on read
。
当我执行 时EXPLAIN
,我看到possible_keys = NULL
和rows = 8011008
(全表)。子查询确实使用键并读取正确的行(2 行)。
另一方面,这个查询:
SELECT * FROM `documents` WHERE `docid` IN (<subquery>)
Run Code Online (Sandbox Code Playgroud)
确实使用索引docid
并且运行速度非常快。它读取的行数比需要的多(根据EXPLAIN
),但完全可以接受。
对此有什么解释吗?
我使用 MariaDB 10。
作为一个有趣的注释(关于SELECT
),如果在<subquery>
我使用 aUNION
时,虽然子查询似乎获得了正确的行数,但主查询似乎不使用索引并进行全表扫描。
如果在UPDATE
I useJOIN
而不是 中IN
,则索引被正确使用。我通过使用解决了我的问题JOIN
。
我正在通过德克萨斯大学镜像10.1.16-MariaDB-1~xenial
从官方 MariaDB apt 存储库中使用 10.1 [stable]。
我在 3 台 Ubuntu 16.04 服务器上设置了一个完美运行的 MariaDB Galera 集群。
然后我升级了它们。现在我什么都没有。
升级到 10.1.16 失败,迅速导致整个集群瘫痪。我没有输出,但是 dpkg 在设置mariadb-server
和mariadb-server-10.1
.
我有备份的,所以我从我的服务器上清除MariaDB的/ MySQL的/加莱拉的所有痕迹(包括移除/var/lib/mysql/
,/etc/mysql/
和/var/log/mysql/
),并开始了。但是,现在,在每台服务器上进行全新安装后,标准系统启动脚本都不起作用。我怀疑这也是升级过程apt
失败的原因。
我已经在我的第一个节点上尝试了以下各项:
galera_new_cluster
service mysql bootstrap
service mysql bootstrap --wsrep-new-cluster
service mysql bootstrap --wsrep-cluster-address="gcomm://"
service mysql start
service mysql start --wsrep-new-cluster
service mysql start --wsrep-cluster-address="gcomm://"
systemctl start mariadb
systemctl start mariadb --wsrep-new-cluster
systemctl start mariadb --wsrep-cluster-address="gcomm://"
Run Code Online (Sandbox Code Playgroud)
每一个都给了我相同的输出:
Job for mariadb.service failed …
Run Code Online (Sandbox Code Playgroud) mariadb-10.1 ×10
mariadb ×9
mysql ×8
galera ×3
clustering ×1
foreign-key ×1
index ×1
innodb ×1
installation ×1
linux ×1
recovery ×1
ubuntu ×1