mysql - .mysql_history 没有被自动保存

标签 mysql linux debian

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

每当我启动 mysql 时,我都没有历史可以回滚(例如,当我尝试向上箭头时,它只会给出一个可视的铃铛警报)。

但是,当我使用它时,历史可以正常工作(在单个 session 中)。即,自从我启动 mysql 以来,我可以回到之前的命令。但是,第二次我退出mysql,我失去我所有的历史并且下次必须重新开始。

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

为了排除故障,我做了三件事,但都没有任何区别:

(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 中设置/调整各种与日志记录相关的配置(通过查看文档;但是,所有设置似乎都与日志记录有关,而不是命令行历史记录)。
/etc/mysql/*.cnf 中没有任何设置似乎与命令行日志记录有关(仅与服务器级日志记录有关,例如到 /var/log/mysql... )。

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

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

首先,要获取所有当前设置的变量的列表,我做了:
% 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

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

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

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

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

史蒂夫

最佳答案

我发现了问题。

居然有两个 用于 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 版本。

史蒂夫

关于mysql - .mysql_history 没有被自动保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35261566/

相关文章:

MySQL:加入很多:在两个表中选择总和

PHP + MySQL - 不会从数据库读取

linux - 自定义 Linux 内核模块来显示年份、日期和时间

linux - 使用 SED 进行字符串替换

python - 不能在文件中写入超过 204800 个字符?

mysql - 在子查询 mysql 上使用 REGEXP 与 IN

MYSQL:仅用主机名替换 FQDN

c - 使用 O_CREAT 调用 open() 的默认模式是什么以及如何在打开/创建文件时正确设置它

ubuntu - gforth 出错,libtool 编译失败

python - 在 Docker 中安装 mysqlclient-python