mysql随笔

2016年12月22日

查看事务隔离级别

select @@tx_isolation;

gtid

https://jin-yang.github.io/post/mysql-gtid.html

获取日期的秒

    UNIX_TIMESTAMP(date)
    day(time)

导入与导出

    导出表结构:mysqldump -u用户名 -p密码 -d 数据库名 表名> db.sql
    导出表结构和数据:mysqldump -u用户名 -p密码 数据库名 > db.sql
    导入sql文件:source /home/abc/db.sql;
    导入sql文件:mysql -u用户名 -p密码 数据库名 < db.sql

mysqldump 报错

报错: Couldn’t execute ‘SET OPTION SQL_QUOTE_SHOW_CREATE=1’

原因: mysql server 端 和 连接端的mysql版本不一致。

mysql root密码忘记

使用无需鉴权模式运行

      cd /usr/local/mysql/bin/
      sudo su
      ./mysqld_safe --skip-grant-tables &

查看一个实例上每个db大小

    use information_schema;
    select table_schema, concat(round(sum(data_length/1024/1024/1024),2),'GB') as data from tables group by table_schema;

索引类型

  • full index 全文索引 : 仅 MyISAM 支持
  • BTREE b树索引
  • hash 索引
  • R-TREE:用来表示 表示空间数据类型(经纬度)(使用说明:传送门

查看数据死锁信息

需要 PROCESS 权限

      show engine innodb status \G;

mysql死锁详解

http://hedengcheng.com/?p=771

http://www.ywnds.com/?p=11093

DML,DCL,DDL

SQL 分类:

SQL 语句主要可以划分为以下 3 个类别。

DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。

DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。(增添改查)

DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。

查看数据库binlog日志

show binary logs;

mysqlbinlog -h ip -P端口 -u用户名 -p密码 –read-from-remote-server mysql-bin.024150 –base64-output=decode-rows -v > binlog.sql

连接串详细配置

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html

autoReconnect 并不推荐使用,因为在程序没有正确处理 SQLExceptions 时,它会导致会话状态和数据一致性的一些副作用。它只被设计用来在应用程序不能正确处理死亡连接抛出的SQLExceptions 时使用,可以考虑将 wait_timeout 设置为一个非常高的值,来代替此配置(默认是8小时)

mysql主备切换gitid变更问题

http://blog.51cto.com/jiajinh/1633589

mysql开启binlog日志

  # 查看 mysql 使用的配置文件目录
  mysql --help --verbose | grep my.cnf

  # 在文件中加入:
  # log_bin
  log-bin = mysql-bin #开启binlog
  binlog-format = ROW #选择row模式
  server_id = 1 #配置mysql replication需要定义,不能喝canal的slaveId重复

  # 重启mysql ,并查看binlog是否开启
  show variables like ‘%log_bin%’

com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

JDBC连接Mysql6 com.mysql.cj.jdbc.Driver, 需要指定时区serverTimezone

类似:

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&?useUnicode=true&characterEncoding=utf8&useSSL=false
    username=root
    password=

mysql 使用 SSL

mysql server 端配置:https://blog.csdn.net/hrbhanyu/article/details/61196443 java客户端在连接时,在连接串中加入配置 useSSL=true。并且需要设置 证书位置:

    System.setProperty("javax.net.ssl.trustStore","/root/truststore" );
    System.setProperty("javax.net.ssl.trustStorePassword","123456" );

查看服务端是否开启了 ssl:

    show global variables like '%ssl%';

mysql 联合索引

explain 使用: 传送门

加入有以下表:

      CREATE TABLE `union_index_test` (
        `a` varchar(200) DEFAULT NULL,
        `b` int(11) DEFAULT NULL,
        `id` int(11) NOT NULL AUTO_INCREMENT,
        PRIMARY KEY (`id`),
        KEY `idx_ab` (`a`,`b`)
      ) ENGINE=InnoDB;

执行SQL: insert into union_index_test(a,b) values("xiaomo", 1),("xiaomo.wj",2),("xiao",3),("xia", 4);

执行 explain select * from union_index_test where id in (1,2); 可以看到它使用的索引是 idx_ab,而不是主键索引,

再次插入一些数据: insert into union_index_test(a,b) values("xiaomo", 5),("xiaomo.wj",6),("xiao",7),("xia", 8);

执行 explain select * from union_index_test where id in (1,2); 它又变成了使用主键索引。

但是如果再 增加一个字段 alter table union_index_test add column c int default -1 ;就会发现无论数据量是多少的情况下,上面的 select 语句都会使用主键索引.

基于上面的测试,得出结论:在数据量较小的情况下,即使使用主键进行查询,也可能最终的执行是 使用 覆盖索引进行全表扫描,而不是直接使用主键索引。

binlog 格式

binlog有三种格式:Statement、Row以及Mixed。

–基于SQL语句的复制(statement-based replication,SBR), –基于行的复制(row-based replication,RBR), –混合模式复制(mixed-based replication,MBR)。在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

MySQL日期时间对秒以下精度的支持

MySQL在5.6.4以及更高版本提供了对秒以下精度时间的存储支持,在以前的版本是会将秒以下的精度忽略掉的。TIME、TIMESTAMP、DATETIME均提供了小数点后6位的支持(微秒)。如果我们想定义一个能存储秒以下精度的日期时间字段,可以如下做,在类型字段后面指定小数点后的精度位数:

    CREATE TABLE t1 (t TIME(3), dt DATETIME(6));

如果我们朝数据库中插入一条记录,时间的精度位数大于表字段能表示的位数,则会造成四舍五入

  • Mysql 日志文件类型 MySQL中有六种日志文件,http://database.51cto.com/art/201806/576300.htm 分别是:
  • 重做日志(redo log)
  • 回滚日志(undo log)
  • 二进制日志(binlog)
  • 错误日志(errorlog)
  • 慢查询日志(slow query log)
  • 一般查询日志(general log)
  • 中继日志(relay log)。

B-tree索引

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

为什么linux kernel默认的页面大小是4K,而不是4M或8M

慢查询阈值

    show variables like '%long_query_time%';

MVCC

增加了3列额外字段来做多版本并发控制

innodb-multi-versioning

innodb 多版本并发控制

mysql 事务加锁分析

MySQL 加锁处理分析

SQL中的where条件,在数据库中提取与应用浅析

MySQL+InnoDB semi-consitent read原理及实现分析:semi-consistent read是read committed与consistent read两者的结合。一个update语句,如果读到一行已经加锁的记录,此时InnoDB返回记录最近提交的版本,由MySQL上层判断此版本是否满足update的where条件。若满足(需要更新),则MySQL会重新发起一次读操作,此时会读取行的最新版本(并加锁)。

mysql 在线ddl 说明

http://www.cnblogs.com/wangtao_20/p/3504395.html

索引添加:http://www.ywnds.com/?p=8893

mysql-connector-java 对UTF-8的支持

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets.html

查看mysql数据物理路径

  show global variables like "%datadir%";

大量数据的表增加字段

https://stackoverflow.com/questions/24660456/mysql-performance-of-adding-a-column-to-a-large-table

mysql最大连接数

最大连接数最好是 核心的3-4倍,否则连接太多,CPU时间分片,上下文切换都会很昂贵,比较耗CPU

JDBC 关于 removeAbandoned 策略

https://caotiancheng.com/2016/09/12/java-debug-junit-connection-pool-config/

有时粗心的程序编写者在从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到maxActive直至连接池无法提供服务.现代连接池一般提供一种“智能”的检查,但设置了removeAbandoned=”true”时,当连接池连接数到达(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时便会启动连接回收,那种活动时间超过removeAbandonedTimeout=”60”的连接将会被回收,同时如果logAbandoned=”true”设置为true,程序在回收连接的同时会打印日志.removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启,生产环境中连接的关闭应该靠程序自己保证.

即如果连接的sql执行超过60s可能会被 removeAbandoned 策略回收,导致 java.sql.SQLException: Connection has already been closed.