Search text in fields in every table of a MySQL database

前端 未结 24 1926
梦谈多话
梦谈多话 2020-11-22 06:23

I want to search in all fields from all tables of a MySQL database a given string, possibly using syntax as:

SELECT * FROM * WHERE * LIKE \'%stuff%\'
         


        
24条回答
  •  轮回少年
    2020-11-22 06:57

    If you are avoiding stored procedures like the plague, or are unable to do a mysql_dump due to permissions, or running into other various reasons.

    I would suggest a three-step approach like this:

    1) Where this query builds a bunch of queries as a result set.

    # =================
    # VAR/CHAR SEARCH
    # =================
    # BE ADVISED USE ANY OF THESE WITH CAUTION
    # DON'T RUN ON YOUR PRODUCTION SERVER 
    # ** USE AN ALTERNATE BACKUP **
    
    SELECT 
        CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
               ' WHERE ', A.COLUMN_NAME, ' LIKE \'%stuff%\';') 
    FROM INFORMATION_SCHEMA.COLUMNS A
    WHERE 
                A.TABLE_SCHEMA != 'mysql' 
    AND     A.TABLE_SCHEMA != 'innodb' 
    AND     A.TABLE_SCHEMA != 'performance_schema' 
    AND     A.TABLE_SCHEMA != 'information_schema'
    AND     
            (
                A.DATA_TYPE LIKE '%text%'
            OR  
                A.DATA_TYPE LIKE '%char%'
            )
    ;
    

    .

    # =================
    # NUMBER SEARCH
    # =================
    # BE ADVISED USE WITH CAUTION
    
    SELECT 
        CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
               ' WHERE ', A.COLUMN_NAME, ' IN (\'%1234567890%\');') 
    FROM INFORMATION_SCHEMA.COLUMNS A
    WHERE 
                A.TABLE_SCHEMA != 'mysql' 
    AND     A.TABLE_SCHEMA != 'innodb' 
    AND     A.TABLE_SCHEMA != 'performance_schema' 
    AND     A.TABLE_SCHEMA != 'information_schema'
    AND     A.DATA_TYPE IN ('bigint','int','smallint','tinyint','decimal','double')
    ;
    

    .

    # =================
    # BLOB SEARCH
    # =================
    # BE ADVISED THIS IS CAN END HORRIFICALLY IF YOU DONT KNOW WHAT YOU ARE DOING
    # YOU SHOULD KNOW IF YOU HAVE FULL TEXT INDEX ON OR NOT
    # MISUSE AND YOU COULD CRASH A LARGE SERVER
    SELECT 
        CONCAT('SELECT CONVERT(',A.COLUMN_NAME, ' USING utf8) FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, 
               ' WHERE CONVERT(',A.COLUMN_NAME, ' USING utf8) IN (\'%someText%\');') 
    FROM INFORMATION_SCHEMA.COLUMNS A
    WHERE 
                A.TABLE_SCHEMA != 'mysql' 
    AND     A.TABLE_SCHEMA != 'innodb' 
    AND     A.TABLE_SCHEMA != 'performance_schema' 
    AND     A.TABLE_SCHEMA != 'information_schema'
    AND     A.DATA_TYPE LIKE '%blob%'
    ;
    

    Results should look like this:

    2) You can then just Right Click and use the Copy Row (tab-separated)

    3) Paste results in a new query window and run to your heart's content.

    Detail: I exclude system schema's that you may not usually see in your workbench unless you have the option Show Metadata and Internal Schemas checked.

    I did this to provide a quick way to ANALYZE an entire HOST or DB if needed or to run OPTIMIZE statements to support performance improvements.

    I'm sure there are different ways you may go about doing this but here’s what works for me:

    -- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEM
    SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';
    
    -- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO OPTIMIZE THEM
    SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';
    

    Tested On MySQL Version: 5.6.23

    WARNING: DO NOT RUN THIS IF:

    1. You are concerned with causing Table-locks (keep an eye on your client-connections)
    2. You are unsure about what you are doing.

    3. You are trying to anger you DBA. (you may have people at your desk with the quickness.)

    Cheers, Jay ;-]

提交回复
热议问题