MySQL 安装(Linux)

参考 Linux 环境搭建中的{{1.13 安装 mysql}}

MySQL 启动(Mac)

mac 下启动 mysql

  1. ##### 启动MySQL服务
  2. > sudo /usr/local/MySQL/support-files/mysql.server start
  3. ##### 停止MySQL服务
  4. > sudo /usr/local/mysql/support-files/mysql.server stop
  5. ##### 重启MySQL服务
  6. > sudo /usr/local/mysql/support-files/mysql.server restart
  7. ##### 终端连接MySQL
  8. > mysql -uroot -proot
  9. ##### 强制关闭mysql
  10. > sudo pkill -9 mysql

MySQL 连接信息

  1. #查看最大连接数,默认是151
  2. show variables like '%max_connection%';
  3. #重新设置最大连接数
  4. set global max_connections=1000;
  5. #在/etc/my.cnf里面设置数据库的最大连接数
  6. # max_connections = 1000
  7. #查看连接数
  8. show status like 'Threads%';
  9. #查看当前用户的连接100之内
  10. show processlist;
  11. #查看当前用户所有的连接
  12. show full processlist;

MySQL 配置文件

必须在 /etc 新建 my.cnf 文件

  1. sudo vim /etc/my.cnf

添加 {{my.cnf 文件内容}}

  1. # 修改文件读写权限
  2. sudo chmod 664 my.cnf
  3. # mysql 认为666权限不安全会忽略掉
  4. 参考文章:https://blog.csdn.net/jyongchong/article/details/77862819

mysql 位置信息

mac

/usr/local/mysql/data/

/var/lib/mysql/

基本命令

database

  1. #创建
  2. create database lane;
  3. #使用
  4. use lane;

table

  1. #创建
  2. create table dept (
  3. dept_id int primary key,
  4. deptName varchar(200)
  5. ) engine = innodb;

查看表数据结构信息

  1. desc user;

查看表创建信息

  1. show create table user;

二进制日志(binary log)

  1. show variables like '%log_bin%'; //是否开启
  2. show variables like '%binlog%';//参数查看 show binary logs;//查看日志文件

慢查询日志(Slow query log)

  1. # 记录所有执行时间超时的查询SQL,默认是10秒。
  2. show variables like '%slow_query%'; //是否开启
  3. show variables like '%long_query_time%'; //时长

查询缓存

  1. show variables like '%query_cache%'; //查看查询缓存是否启用,空间大小,限制等
  2. show status like 'Qcache%'; //查看更详细的缓存参数,可用缓存空间,缓存块,缓存多少等

存储引擎 innoDB 命令

存储引擎

  1. show engines //命令,就可以查看当前数据库支持的引擎信息。

Buffer Pool 配置参数

  1. show variables like '%innodb_page_size%'; //查看page页大小
  2. show variables like '%innodb_old%'; //查看lru list中old列表参数
  3. show variables like '%innodb_buffer%'; //查看buffer pool参数
  4. # 建议:将innodb_buffer_pool_size设置为总内存大小的60%-80%,
  5. # innodb_buffer_pool_instances可以设置为多个,这样可以避免缓存争夺。

Change Buffer

  1. # ChangeBuffer占用BufferPool空间,默认占25%,最大允许占50%,可以根据读写业务量来 进行调整。
  2. # 参数innodb_change_buffer_max_size;
  3. show variables like '%innodb_change_buffer_max_size%';

Log Buffer

  1. show variables like '%innodb_log_buffer_size%';
  2. show variables like '%innodb_log%';
  3. show variables like '%innodb_flush_log_at_trx_commit%'
  4. set global innodb_flush_log_at_trx_commit =2
  5. innodb_ush_log_at_trx_commit 参数控制日志刷新行为,默认为 1
  6. 0 每隔 1 秒写日志文件和刷盘操作(写日志文件 LogBuer-->OS cache,刷盘 OS cache--> 磁盘文件),最多丢失 1 秒数据
  7. 1 事务提交,立刻写日志文件和刷盘,数据不丢失,但是会频繁 IO 操作
  8. 2 事务提交,立刻写日志文件,每隔 1 秒钟进行刷盘操作

通用表空间

  1. CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd Engine=InnoDB; //创建表空间ts1
  2. CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1; //将表添加到ts1表空间

查看线程

  1. show variables like '%innodb_purge_threads%';
  2. show variables like '%innodb_page_cleaners%';

查看文件存储格式

  1. # \G 表示以列的形式展示
  2. show table status \G;
  3. # 通过 information_schema 查看指定表的文件格式
  4. select * from information_schema.innodb_sys_tables \G;

修改文件格式

  1. ALTER TABLE 表名 ROW_FORMAT=格式类型;
  2. # 只有在重新创建表及其索引才生效

Undo Log 信息

  1. show variables like '%innodb_undo%';

Redo Log 信息

  1. show variables like '%innodb_log%';

系统日志命令

Binlog 状态查看

  1. show variables like 'log_bin';

开启 Binlog 功能

  1. mysql> set global log_bin=mysqllogbin;
  2. ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
  3. #需要修改my.cnf或my.ini配置文件,在[mysqld]下面增加log_bin=mysql-bin,重启 MySQL服务。
  4. #可以开启之后通过命令行设置记录的类型
  5. set global binlog_format='ROW';
  6. #开启binlog日志大概会有1%的性能损耗。
  1. # Replication Master Server (default)
  2. # binary logging is required for replication
  3. log-bin=mysql-bin
  4. # binary logging format - mixed recommended
  5. binlog_format=mixed
  6. server-id = 1
  7. # expire_logs_days = 7 //binlog过期清理时间
  8. # max_binlog_size 100m //binlog每个日志文件大小

常用 Binlog 命令

  1. # 查看所有binlog日志列表
  2. show binary logs; //等价于show master logs;
  3. #查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
  4. show master status;
  5. show binlog events;
  6. show binlog events in 'mysql-bin.000001';
  7. #刷新log日志,自此刻开始产生一个新编号的binlog日志文件
  8. flush logs;
  9. #重置(清空)所有binlog日志
  10. reset master;
  11. purge binary logs to 'mysql-bin.000001'; //删除指定文件
  12. purge binary logs before '2021-07-08 00:00:00'; //删除指定时间之前的文件
  13. #可以通过设置expire_logs_days参数来启动自动清理功能。默认值为0表示没启用。
  14. #设置为1表示超出1天binlog文件会自动删除掉。

恢复 binlog 数据

  1. cd /usr/local/mysql/data
  2. #执行命令
  3. mysqlbinlog --start-position=219 --stop-position=1496 mysql-bin.000001 | mysql -uroot -proot
  4. #出现错误
  5. mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8'
  6. mysqlbinlog --no-defaults --start-position=219 --stop-position=1496 mysql-bin.000001 | mysql -uroot -proot
  7. # mysqlbinlog --no-defaults --start-position=219 --stop-position=1496 --database=lanebin mysql-bin.000001 | mysql -uroot -proot -v lanebin

常用参数选项解释:
—start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地服务器的时间
—stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地服务器的时间 取值和上述一样
—start-position:从二进制日志中读取指定 position 事件位置作为开始。
—stop-position:从二进制日志中读取指定 position 事件位置作为事件截至
—database=lanebin 指定只恢复 zyyshop 数据库(一台主机上往往有多个数据库,只限本地 log 日志) 不常用选项:
-u —user=name 连接到远程主机的用户名
-p —password[=name] 连接到远程主机的密码
-h —host=name 从远程主机上获取 binlog 日志
—read-from-remote-server 从某个 MySQL 服务器上读取 binlog 日志


索引相关命令

查看索引

  1. show index from table_name \G;
  2. show index from dept \G;

删除索引

  1. drop index indexName ON table_name;
  2. drop index deptcode_1 on dept;
  3. drop index deptcode_2 on dept;
  4. drop index deptcode_3 on dept;

创建普通索引

创建表的时候添加

  1. CREATE TABLE tablename ( [...], INDEX 索引的名字 (字段名));
  2. create table dept (
  3. id int primary key ,
  4. deptname varchar(200),
  5. deptcode varchar(200),
  6. index deptname_1(deptname),
  7. index deptcode_1(deptcode)
  8. ) engine =innodb charset =utf8;

修改表结构添加

  1. ALTER TABLE tablename ADD INDEX [索引的名字] (字段名);
  2. alter table dept add index deptcode_2(deptcode);

直接创建索引

  1. CREATE INDEX indexName ON tableName (字段名);
  2. create index deptcode_3 on dept(deptcode);

创建唯一 索引

  1. CREATE UNIQUE INDEX 索引的名字 ON tablename (字段名);
  2. ALTER TABLE tablename ADD UNIQUE INDEX 索引的名字 (字段名);
  3. CREATE TABLE tablename ( [...], UNIQUE 索引的名字 (字段名) ;

创建主键索引

  1. CREATE TABLE tablename ( [...], PRIMARY KEY (字段名) );
  2. ALTER TABLE tablename ADD PRIMARY KEY (字段名);
  3. #可以看出一般创建表的时候指定了primary key则默认创建主键索引

创建复合索引

  1. CREATE INDEX 索引的名字 ON tablename (字段名1,字段名2...);
  2. ALTER TABLE tablename ADD INDEX 索引的名字 (字段名1,字段名2...);
  3. CREATE TABLE tablename ( [...], INDEX 索引的名字 (字段名1,字段名2...) );

创建全文索引

  1. CREATE FULLTEXT INDEX 索引的名字 ON tablename (字段名);
  2. ALTER TABLE tablename ADD FULLTEXT 索引的名字 (字段名);
  3. CREATE TABLE tablename ( [...], FULLTEXT KEY 索引的名字 (字段名) ;

全文索引语法

  1. #和常用的like模糊查询不同,全文索引有自己的语法格式,使用 match 和 against 关键字进行等值匹配
  2. #注意在innodb引擎模糊匹配至少要有3个字符最多84个字符,否则失效
  3. select * from user where match(name) against('aaa');

布尔模式

  1. #采用布尔模式可以模糊匹配,否则是等值匹配
  2. select * from user where match(name) against('a*' in boolean mode);

自适应哈希

  1. show engine innodb status \G;
  2. show variables like '%innodb_adaptive%';

EXPLAIN 命令

  1. EXPLAIN SELECT * from user WHERE id < 3;

慢查询

是否开启慢查询

  1. SHOW VARIABLES LIKE 'slow_query_log%';

开启慢查询

  1. SET global slow_query_log = ON;
  2. SET global slow_query_log_file = 'slow_query_log.log';
  3. #记录不使用索引的查询
  4. SET global log_queries_not_using_indexes = ON;
  5. #记录超过查询时间阈值
  6. SET long_query_time = 0.0001;

查询慢查询日志

  1. show variables like '%slow_query%';

分页查询

查看 profiling 是否开启

  1. #默认关闭
  2. show variables like 'profiling'

开启 profiling 功能

  1. set profiling = 1

查询 sql 执行时间

  1. show profiles

分页查询

  1. SELECT * FROM 表名 LIMIT [offset,] rows
  2. #偏移量从0开始
  3. select * from user limit 1000,10; //查询前1000条数据之后的10条,既是1001~1010

事务相关

查看事务隔离级别

  1. show variables like 'tx_isolation';
  2. #或者
  3. select @@tx_isolation;

设置事务隔离级别

  1. #会话设置
  2. set tx_isolation='READ-UNCOMMITTED';
  3. set tx_isolation='READ-COMMITTED';
  4. set tx_isolation='REPEATABLE-READ';
  5. set tx_isolation='SERIALIZABLE';
  6. #全局设置加上global
  7. set global tx_isolation='READ-UNCOMMITTED';

开启事务

  1. #开启事务
  2. begin;
  3. #提交事务
  4. commit;
  5. #回滚事务
  6. rollback

添加锁的语句

  1. RR 隔离级别,InnoDB 对于记录加锁行为都是先采用 Next-Key Lock,但是当 SQL 操作含有唯一索引 时,Innodb 会对 Next-Key Lock 进行优化,降级为 RecordLock,仅锁住索引本身而非范围。
  2. 1select ... from 语句:InnoDB 引擎采用 MVCC 机制实现非阻塞读,所以对于普通的 select 语句, InnoDB 不加锁
  3. 2select ... from lock in share mode 语句:追加了共享锁,InnoDB 会使用 Next-Key Lock 锁进行处 理,如果扫描发现唯一索引,可以降级为 RecordLock 锁。
  4. 3select ... from for update 语句:追加了排他锁,InnoDB 会使用 Next-Key Lock 锁进行处理,如果扫 描发现唯一索引,可以降级为 RecordLock 锁。
  5. 4update ... where 语句:InnoDB 会使用 Next-Key Lock 锁进行处理,如果扫描发现唯一索引,可以 降级为 RecordLock 锁。
  6. 5delete ... where 语句:InnoDB 会使用 Next-Key Lock 锁进行处理,如果扫描发现唯一索引,可以降 级为 RecordLock 锁。
  7. 6insert 语句:InnoDB 会在将要插入的那一行设置一个排他的 RecordLock 锁。

表锁相关

  1. #添加表锁的语句
  2. lock table 表名称 read|write,表名称2 read|write;
  3. lock table user read ;
  4. #删除表锁的语句
  5. unlock tables;
  6. #查看表锁的语句
  7. show open tables;

共享锁(行级锁-读锁)

  1. select ... lock in share mode
  2. select * from user where id =1 lock in share mode

排他锁(行级锁-写锁)

  1. #排他锁的方法是在 SQL 末尾加上 for update,innodb 引擎默认会在 update,delete 语句加上 for update
  2. select * from user where id =1 for update

死锁相关

  1. #查看死锁日志
  2. show engine innodb status \G;
  3. #查看锁状态变量
  4. show status like 'innodb_row_lock%'
  5. #Innodb_row_lock_current_waits:当前正在等待锁的数量
  6. #Innodb_row_lock_time:从系统启动到现在锁定总时间长度
  7. #Innodb_row_lock_time_avg: 每次等待锁的平均时间
  8. #Innodb_row_lock_time_max:从系统启动到现在等待最长的一次锁的时间
  9. #Innodb_row_lock_waits:系统启动后到现在总共等待的次数