首页 > 数据库 >使用TcpDump 和 Wireshark 分析数据库异常

使用TcpDump 和 Wireshark 分析数据库异常

时间:2024-08-14 17:51:07浏览次数:13  
标签:set java String 数据库 xxx character sql TcpDump Wireshark

MySQL : 5.7.19
OS : rhel 6.3
jdbc : mysql-connector-java-5.1.45.jar
java : 17.0.7
问题 :MySQL 数据库在修改 character_set_server 和 表的对应字段 为 utf8mb4 后,任然无法插入emoji 表情

1. 抓包

1、登陆MySQL服务器,确定实际使用的网卡;
2、执行 tcpdump -s 65535 -x -nn -q -tttt  -i eth0 '((tcp) and (port 3306) and ((src host 10.57.xxx.xx) or (src host 10.xxx.xxx.xx)))' -w /opt/mysql_tcpdump233.pcap

其中,10.57.xxx.xx 为我本地ip,10.xxx.xxx.xx 为数据库IP

2. 用java 模拟客户端登录数据库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
 
public class MySQLDemo {
 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    // DB_URL    mysql://IP:PORT/schema_name
    // 指定字符集   characterEncoding=UTF8
    static final String DB_URL = "jdbc:mysql://10.xxx.xxx.xx:3306/wnmprd14?useSSL=false&characterEncoding=UTF8";

    // 数据库的用户名与密码
    static final String USER = "admin";
    static final String PASS = "wnmRds@233";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);
        
            // 打开链接
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行
            stmt = conn.createStatement();
            String sql;
            sql = "show variables like '%char%'";
            ResultSet rs = stmt.executeQuery(sql);
        
            while(rs.next()){
                String Variable_name  = rs.getString("Variable_name");
                String Value = rs.getString("Value");
    
                System.out.print("Variable_name: " + Variable_name);
                System.out.print(", Value: " + Value);
                System.out.print("\n");
            }
            // 完成后关闭
             rs.close();
             stmt.close();
             conn.close();
        }catch(SQLException se){
            se.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
            }
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("bye!");
    }
}

执行该断代码后,模拟的是应用通过 jdbc 向数据库建立一个链接,并且返回当前连接的 字符集的相关信息

3. 使用 Wireshark 分析

用 Wireshark 打开mysql_tcpdump233.pcap 文件进行分析:

img

客户端,在与MySQL 数据库三次握手之后,向数据库请求了以下信息

/* mysql-connector-java-5.1.45 ( Revision: 9131eefa398531c7dc98776e8a3fe839e544c5b2 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS tx_isolation, @@wait_timeout AS wait_timeout

img

在获取到character_set_server 的值为utf8mb4 后,任然进行了SET NAMES utf8操作

img

标签:set,java,String,数据库,xxx,character,sql,TcpDump,Wireshark
From: https://www.cnblogs.com/Miac/p/18359413

相关文章

  • [Python] 通过pymongo连接docker中并开启了副本集的mongodb数据库
    需要指定directConnection=true&authSource=atp-test参数,,否则会报连接副本集超时。在PyMongo中,directConnection参数可以决定客户端是否直接连接到MongoDB服务器,而不是自动发现所有的副本集成员。当directConnection设置为true时,客户端将只连接到MongoDB连接字符......
  • 数据库表对应的实体类上的相关注解
    一、解释这些注解是Java中常用的Lombok库和MyBatis-Plus框架提供的,用于简化实体类的开发和ORM映射。下面是对每个注解的解释:1.**@Data**:  -这是Lombok库的一个综合注解,包含了以下几个注解的功能:   -`@Getter`:为所有字段生成getter方法。   -`@Setter`:......
  • SSM基于的社区疫情防控管理信息系统的设计与实现khjit 本系统(程序+源码+数据库+调试部
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:居民,核酸检测,检测预约,检测记录,健康上报,出入信息,物品申请,物品派送开题报告内容一、课题背景与意义随着全球新冠疫情的持续蔓延,社区疫情防控成为......
  • SQLServer 错误: 8646,在数据库 'msdb',表 1077578877 的索引 ID 1 中找不到索引条目
    一台非生产服务器,磁盘被打满了,刚开始以为只是正常的磁盘使用增长满了,就清理了一部分空间出来,没过一会,就又满了,排查到sqlserver的错误日志文件一直在增 同时查看sqlserver错误日志,大量报错日志:[298]SQLServer错误:8646,在数据库'msdb',表1077578877的索引ID1中找不到索......
  • Thinkphp6多数据库实例跨库操作
    ThinkPHP6.env文件database.php数据库配置配置.env文件#默认数据库配置DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=default_dbDB_USERNAME=rootDB_PASSWORD=#第二个数据库配置DB2_CONNECTION=mysqlDB2_HOST=127.0.0.1DB2_PORT=3306DB2_DAT......
  • 在Centos系统源码安装postgreSQL数据库及postGIS扩展
    本次安装的各版本如下postgresql-13.5.targeos-3.10.2gdal-3.4.1proj-8.2.1postgis-3.2.1一、安装postgreSQL1.1安装包下载地址选postgresql-13.5.tar.gz。使用工具将下载好的包传到服务器。解压,进入解压目录[root@localhostlocal]#yuminstallgccreadline-develzlib-d......
  • 数据库服务器运维最佳实践
    数据库服务器运维是确保数据库系统高效、稳定和安全运行的关键环节。随着信息技术的不断发展,数据库系统的规模和复杂性不断增加,对运维工作的要求也越来越高。以下将从硬件选择、操作系统和文件系统优化、数据库版本选择、参数优化、数据备份与恢复、性能监控与调优、安全管......
  • Python轻量级 NoSQL 数据库之tinydb使用详解
    概要在现代应用开发中,使用数据库来存储和管理数据是非常常见的需求。对于简单的数据存储需求,关系型数据库可能显得过于复杂。TinyDB是一个纯Python实现的轻量级NoSQL数据库,专为嵌入式场景设计,适用于小型项目、原型开发和教学等场景。本文将详细介绍TinyDB库,包括其安......
  • 宝塔硬盘满了,宝塔不能登录,数据库宕机解决办法
    1.命令查看硬盘是否满了:df如果满了,清楚日志,清理磁盘打开SSH软件清理二进制日志:rm-f/www/server/data/ib_*rm-f/www/server/data/mysql-bin*启动数据库servicemysqldstart2.宝塔就可以连接上了,查看一下占满的原因:3)数据库日志占满,关闭日志就行了,需要打开的话重新打开4)......
  • 宝塔如何数据库的备份与导入
    点击备份按钮(无备份),(如图)选择备份,即可备份当前数据库文件。点击导入按钮,(如图)可以选择本地上传,或选择已备份的文件还原。默认数据库路径为/www/backup/database。以上备份导入均是使用mysqldump。导入的sql文件格式必须符合标准,若你使用phpmyadmin导出的sql文件,可能会缺少版......