mysql 找到重复的数据

简介

工作中测试反馈-页面上显示了两个相同的数据,于是叫我把两条相同的数据找出来。

其实这就是当初表设计时,没对唯一字段(比如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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值