简介
工作中测试反馈-页面上显示了两个相同的数据,于是叫我把两条相同的数据找出来。
其实这就是当初表设计时,没对唯一字段(比如phone)添加 唯一约束 导致的坑,现在首先要把数据找出来,然后再填坑,在找出数据的时候又踩了一些坑,下面开始正式的填坑之路
申明 以下所有数据和数据库表结构为自己模拟数据,并非公司真实数据
找出相同的数据的SQL
SELECT id,onlyid FROM
(
SELECT * FROM TEST_TABLE a WHERE a.onlyid in
(select onlyid from TEST_TABLE group by onlyid having count(*) > 1 )
) as tmp
order by onlyid;
以后再遇到类似问题,就拷贝上面sql,并替换调 TEST_TABLE和onlyid就行
很容易的就找出了很多条相同的onlyid的两条数据,以下只列出两条假数据:
+------------------------------------------+------------------+
| id | onlyid |
+------------------------------------------+------------------+
| M51D204B0F35322AF7E7050612AB26E7ABDDA70C | 1 |
| F75BF608F269AC73FF561EEFFDACFE99457A6CA8 | 1 |
...
然后想着只有把查询结果导出来,然后再找PM帮忙确认哪些id的是错误的就行了,结果就开始了踩坑之路
(其实数据也就10多条,我拷贝下来稍微处理一下就OK了,但我就不,还导致我加班了,我还是太年轻了!!!)
导出数据
SELECT id,onlyid FROM
(
SELECT * FROM TEST_TABLE a WHERE a.onlyid in
(select onlyid from TEST_TABLE group by onlyid having count(*) > 1 )
) as tmp
order by onlyid
into outfile '/home/same_info.csv';
好,从这一步开始报错:
报错信息:
ERROR 1045 (28000): Access denied for user 'aUser'@'%' (using password: YES)
好的问题不大,当时想着是mysql 账户权限问题,
但是查着查着就以为是linux服务器上mysql这个用户对same_info.csv的权限不足
于是添加了chmod 777 same_info.csv
结果。。。还是这个问题,这时说明我解决问题的思路偏了,即时打住
查看当前mysql user 权限
select * from user\G;
发现当前用户几乎什么权限都有,就是没有 File_priv
权限
*************************** 1. row ***************************
Host: %
User: aUser
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: N
Process_priv: Y
File_priv: N
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: N
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string:
password_expired: N
Load_from_S3_priv: Y
Select_into_S3_priv: Y
Invoke_lambda_priv: Y
*************************** 2. row ***************************
...
所以认为这个不是mysql root账户,root账户所有权限都有
root账户和普通账户
这个是root账户,全部权限都有!
*************************** 5. row ***************************
Host: localhost
User: xxadmin
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string:
password_expired: N
Load_from_S3_priv: Y
Select_into_S3_priv: Y
Invoke_lambda_priv: Y
5 rows in set (0.00 sec)
对比aUser和xxadmin,以下aUser为N的选项,
Shutdown_priv: N
File_priv: N
Super_priv: N
Create_tablespace_priv: N
哈哈,感觉aUser对比xxadmin还是差一点啊,都不能shutdown mysql服务
目前怎么办呢?又不可能叫公司的人帮我开权限,而且也就是一个数据导出的功能,此时只能想其他办法了
使用shell中运行mysql sql语句的方式 利用输出重定向 输出到.csv文件中
编写一个shell脚本玩一玩,刚好可以满足需求
#! /bin/bash
DB_HOST=
DB_PORT=
DB_USER=
DB_PASSWORD=
DB_NAME=
/usr/bin/mysql -h${DB_HOST} -p${DB_PORT} -u${DB_USER} -p${DB_PASSWORD} -D ${DB_NAME} -N -B -e "select * from
( select * from TEST_TABLE a where a.uniqueid in
(select onlyid from TEST_TABLE group by onlyid having count(*) > 1 )
) as tmp
order by onlyid;" > test.txt
连接数据库参数说明
-u
-p
-h
-D
-N 不输出列信息
-B 使用tab键代替默认交互分割符
-e 执行SQL语句
-E 垂直输出
-H 以HTML格式输出
-X 以XML格式输出
mysql -h${DB_HOST} -p${DB_PORT} -u${DB_USER} -p${DB_PASSWORD} -D ${DB_NAME} -N -B -e "select * from
( select * from TEST_TABLE a where a.uniqueid in
(select onlyid from TEST_TABLE group by onlyid having count(*) > 1 )
) as tmp
order by onlyid;" > test.txt
最后完美解决:
每条数据都以 tab 分隔
参考文献
https://stackoverflow.com/questions/6091427/mysql-into-outfile-access-denied-but-my-user-has-all-access-and-the-fold
https://www.cnblogs.com/yizhipanghu/p/9699106.html
https://www.cnblogs.com/liuhaidon/archive/2019/09/12/11511129.html