.mysql_history 没有被自动保存

.mysql_history not being saved automatically

我无法为我的用户获取 mysql 命令行历史记录,即使它对同一台机器上的其他用户工作正常(mysql Debian 上的 5.5 "wheezy"发行版。)我无能为力,希望这里有人可以帮助我...

每当我开始 mysql 时,我都没有要回滚的历史记录(例如,当我尝试向上箭头时,它只会发出视觉铃铛警报)。

然而,当我使用它时,历史记录工作正常(在一个会话中)。也就是说,我可以返回到我开始 mysql 后的早期命令。但是,第二次我退出 mysql,我 失去了我所有的历史记录 并且下次必须重新开始。

不用说,这非常令人沮丧!

为了排除故障,我做了三件事,none 其中一点影响都没有:

(1) 我明确设置了环境变量(使用bash):

% MYSQL_HISTFILE=~/.mysql_history
% echo $MYSQL_HISTFILE
/var/home/userx/.mysql_history

...我仔细检查了权限设置是否正确(在文件和目录上——注意,我创建了一个空文件只是为了确保它自己创建它没有问题):

drwxr-xr-x  53 userx userx 4096 Jan 24 15:26 /var/home/userx
-rw-------   1 userx userx    0 Jan 31 04:14 /var/home/userx/.mysql_history

我确认它是“-rw-------”并且该文件归相关用户(我)所有,与同一台机器上的所有其他用户相同,并且可以正常工作。虽然,mysql 客户端文档没有说你需要设置这个环境变量,除非你想改变它(所以我当然也尝试过不设置那个变量)。

(2) 我在 /etc/mysql/my.cnf 中尝试了 setting/tweaking 各种与日志记录相关的配置(通过查看文档;然而,所有设置似乎真的是关于日志记录的,而不是关于命令行历史的。

None /etc/mysql/*.cnf 中的设置似乎与命令行日志记录有关(仅与服务器级日志记录有关,例如 /var/log/mysql...)。

可以肯定的是,我将所有内容恢复到标准安装中的状态(通过 debian wheezy apt-get install mysql)所以我的任何胡闹实际上都不是原因。 (注意:它对同一台机器上的其他用户工作正常!)

(3) 我在 mysql 中尝试了 examining/tweaking 各种变量(基于我看到的各种帖子)。但是这些很难找到好的信息,而且由于它适用于同一台机器上的其他用户,我怀疑这是否重要。无论如何,这就是我在这里所做的:

首先,为了获得所有当前设置变量的列表,我做了:

% echo "show variables" | mysql > /tmp/vars

翻阅它们,我没有看到任何似乎相关的内容。但这里有一些例子(在这里转储所有例子太长了;让我知道是否有一个变量或一个搜索我可以做,但可能会产生答案):

% grep -i hist /tmp/vars
performance_schema_events_waits_history_long_size       10000
performance_schema_events_waits_history_size    10
profiling_history_size  15

...以及...

% grep -i log /tmp/vars    (note: irrelevant binlog stuff excerpted)
back_log        50
expire_logs_days        10
general_log     OFF
general_log_file        /var/lib/mysql/xxx.log
innodb_log_group_home_dir       ./
innodb_mirrored_log_groups      1
log     OFF
log_error
log_output      FILE
log_queries_not_using_indexes   OFF
log_slave_updates       OFF
log_slow_queries        OFF
log_warnings    1
slow_query_log  OFF
slow_query_log_file     /var/lib/mysql/rimu3-slow.log

None 这些似乎相关,我基于与更改变量相关的各种网络搜索所做的任何事情也没有解决我的问题——而且,请记住:none 其他用户在同一个机器有这个问题。因此,除非我没有发现的变量或其他服务器状态实际上专门指我的用户,或者在某处我没有发现专门指我的用户的访问策略(例如),这是无法解释的。

关于 mysql_history 文件,我可以在任何地方 找到的唯一文档是 here。但是它并没有告诉你如何启用mysql_history! (它只说明了如何禁用它,或者改变它的去向,这对我来说也没有任何改变。)

总而言之,我已经确认,我的故障排除最终并没有导致任何设置不正确:我回到了标准环境变量、服务器配置、变量等。

我真的完全被难住了。任何帮助将不胜感激!

史蒂夫

我发现了问题。

实际上有 两个 文件用于 mysql 历史记录:~/.mysql_history~/.mysql_history.TMP。我只使用 ptrace:

发现了第二个文件
open("/var/home/userx/.mysql_history.TMP", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0600) = -1 EACCES (Permission denied)

知道有两个文件,问题就清楚多了:

% ls ~/.mysql_history*
-rw-------   1 userx userx      0 Jan 31 04:14 /var/home/userx/.mysql_history
-rw-------   1 root  root  279506 May 11  2014 /var/home/userx/.mysql_history.TMP

(是的,这个问题可以追溯到 2014 年 5 月,所以现在一切都变得很有意义了。)

就我而言,我通过 sudo 获得了 root 访问权限,因此我可以轻松修复它:

% sudo chown userx:userx /home/userx/.mysql_history.TMP

随后 mysql 的使用效果非常好(尽管我之间的所有历史记录仍然永远丢失了)。 :-(

根本问题是: (a) mysql 文档没有提到这个文件(事实上,不应该真的需要它),并且 (b) mysql 客户端不会向最终用户提供任何错误消息,让他们知道此文件在启动或退出时都是不可修改的。

--

所以,简而言之:

(1) mysql 文档没有提及它使用需要相同权限的 .mysql_history.TMP 的任何地方。

(2) 使用像 rlwrap 这样的包装器解决了这个问题(见我上面的评论),因为它显然不使用该文件的 .TMP 版本。

史蒂夫