编辑:从 mysql 5.6 更新现有数据库并执行时:
UPDATE phppos_register_log SET shift_end = '2015-01-01 00:00:00' WHERE shift_end = '0000-00-00 00:00:00';
这产生:
#1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'shift_end' at row 1
#1067 - Invalid default value for 'shift_start'
Run Code Online (Sandbox Code Playgroud)
这在 mysql <=5.7 中有效。我找不到任何关于此的文档......这有什么问题?
CREATE TABLE `phppos_register_log` (
`register_log_id` int(10) NOT NULL AUTO_INCREMENT,
`employee_id_open` int(10) NOT NULL,
`employee_id_close` int(11) DEFAULT NULL,
`register_id` int(11) DEFAULT NULL,
`shift_start` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`shift_end` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`open_amount` decimal(23,10) NOT NULL, …
Run Code Online (Sandbox Code Playgroud) 我正在运行 1gb 的 RAM 机架空间数据库服务器。出于某种原因,在大约 2 天内,内存使用量从使用很少的交换变为使用 100mb。如果我不重新启动 sql,它将继续使用更多的交换。(我的 my.cnf 文件如下所示,内存使用情况如下所示)
一些背景:我有大约 50 个活动数据库,它们具有相同的模式,这些数据库使用 INNODB 来处理表。我有几个使用 MyISAM 的流量很少的数据库。
在 INNODB 表上,我不使用持久连接。我还有一个创建临时表的报告功能。(这可能是资源密集型的,但并不经常发生)
我正在使用 CENTOS 6.3 和 mysql 5.5.28-log
即使我使用的是swap,性能仍然相当不错。我只是担心如果我每隔几天不重新启动我就会出问题。
这是我大约 2 天的 free -m 日志:(第一条记录是在 mysql 重新启动后)
12/26 2:08 PM EST
total used free shared buffers cached
Mem: 992 697 295 0 74 362
-/+ buffers/cache: 260 732
Swap: 976 15 961
12/26 4:10 PM EST
[root@php-pos-db ~]# free -m
total used free shared buffers cached
Mem: 992 791 201 0 …
Run Code Online (Sandbox Code Playgroud) 我有 300 个数据库,每个数据库最多 59 个表。我的托管服务提供商说我有很多打开的表。我没有任何性能问题;但它会导致备份问题(我使用了使用 Percona XtraBackup 的 rackspace 云数据库)
什么会导致大量开放表,我该如何减少这种情况?我没有太多的流量,性能很好。我也不确定我是否完全理解打开的表是什么。
我确实table_definition_cache
设置为,4096
因为在我增加它之前我无法对视图运行查询。
mysql> SHOW GLOBAL STATUS LIKE 'Open_%';
mysql> +--------------------------+----------+
-> | Variable_name | Value |
-> +--------------------------+----------+
-> | Open_files | 7 |
-> | Open_streams | 0 |
-> | Open_table_definitions | 4102 |
-> | Open_tables | 4096 |
-> | Opened_files | 44025318 |
-> | Opened_table_definitions | 1660409 |
-> | Opened_tables | 1857375 |
-> +--------------------------+----------+
Run Code Online (Sandbox Code Playgroud)
以下是请求的命令:
https://gist.github.com/blasto333/aa4241a4e37447961188356719ea6984
我正在阅读这篇文章,似乎没有办法做这样的事情:
SELECT COUNT(*)
WHERE SHOW VARIABLES
WHERE Variable_name = 'innodb_ft_cache_size'
Run Code Online (Sandbox Code Playgroud)
我可以执行以下操作,但这在 MySQL 5.7 中不起作用(表中没有变量)
SELECT COUNT(*)
FROM information_schema.GLOBAL_VARIABLES
WHERE Variable_name = 'innodb_ft_cache_size' (always returns 0)
Run Code Online (Sandbox Code Playgroud)
我需要这样做的原因是在存储过程中检测他们是否有能力做全文。它需要在MySQL
MySQL 和变体中工作,所以我不能简单地解析@@verison.
有没有另一种方法可以做到这一点?
这是一个works on 5.5,5.6, and 5.7
用于检测是否存在全文功能的存储过程。这也应该适用于 mysql 变体
begin
set @supports_ft = 0;
set @information_schema_exists := (SELECT COUNT(SCHEMA_NAME) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'information_schema');
if @information_schema_exists > 0 then
set @information_schema_exists_global_vars_exists := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'information_schema' AND TABLE_NAME = 'GLOBAL_VARIABLES');
if @information_schema_exists_global_vars_exists …
Run Code Online (Sandbox Code Playgroud) 我希望为 MySQL 中的密码重置生成一个加密安全的字符串。我知道我可以在 PHP 的应用程序级别执行此操作;但这需要我的许多客户可能没有的 OpenSSL 扩展。
如果我能以一种广泛可用的安全方式在 MySQL 5 中做到这一点,那将是理想的。这可能吗?
注意:这是为了生成密码重置的安全令牌。它与安全连接没有任何关系,因此使用 https 不是解决方案。
我认为这是一个很容易通过谷歌搜索的问题;但我找不到它。
给出以下查询:
SELECT name, MATCH (name) AGAINST ('vision black*' IN BOOLEAN MODE) as rel
FROM (`phppos_items`)
WHERE MATCH (name) AGAINST ('vision black*' IN BOOLEAN MODE) AND `deleted` = 0
ORDER BY `rel` DESC LIMIT 100
Run Code Online (Sandbox Code Playgroud)
匹配分数越高是否相关性越高?有人能给我指出正确的 mysql 手册页来解释这一点吗?
根据简单的观察,分数越高似乎越好。
我正在将全文搜索添加到已经存在的 mysql 表中,这些表具有 id 整数的主要自动递增键。
当我添加全文索引时,我收到一条警告:
/*!50604 ALTER TABLE `phppos_additional_item_numbers` ADD FULLTEXT INDEX item_number_search (`item_number`)*/;
Warning (Code 124): InnoDB rebuilding table to add column FTS_DOC_ID
Run Code Online (Sandbox Code Playgroud)
我不能简单地重构我的所有代码以添加列 FTS_DOC_ID 来删除此警告。允许这种警告发生是不是很糟糕?
我正在 mysql 5.7 中测试我的应用程序,并且有一些代码不适用于 ONLY_FULL_GROUP_BY ON。我会在以后的版本中修复这个问题。我找到了一种方法,通过在运行任何查询之前执行 'SET SESSION sql_mode=""' 来为我的应用程序关闭此功能。
我有两个问题:
这是否适用于对数据库没有 root 访问权限的共享主机服务?它似乎对我的测试有效。
由于模式设置为 '' 这实际上意味着什么?对我来说,这似乎是将其设置为无,并且不受限制。(我的另一个想法是它将它设置为空,让 mysql 决定做什么)。
根据我对手动空模式的阅读,mysql 5.1 中默认使用手动空模式,但每个版本都变得更加严格。对于 mysql 5.7,它是ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION
.
因此,基于此,模式似乎是一个规则列表,如果它为空,则规则是否适用?
另外,如果我将模式设置为“”,这将始终禁用服务器设置的模式吗?