mysql8数据库

mysql8数据库

软件版本
mysql8.0.17
mysql workbench8.0.18
节点IP系统功能CPU内存硬盘
node110.80.10.1centos7.9mysql4核心8GB20GB

mysql8的二进制安装

数据的保留方式:

  • 文本保留。

  • excel保留。

  • mysql数据库保留。

mysql数据保留的优点:

  • 易操作:能够简单实现增删改查。

  • 开发中经常使用mysql来存储数据。

mysql数据库介绍:

  • 流行的关系型数据库:能用来存储用户数据、商品数据等等。

  • mysql目前是属于oracle公司。oracle也是知名的关系型数据库,但它是收费的。

  • 另外还有一种非关系型nosql数据库例如redis、mongodb等也很常用。

mysql安装说明:

  • rpm或yum安装,生产环境比较少用。

  • 编译安装或者二进制安装,生产环境较经常使用。

  • 选择二进制的安装包下载安装。

node1

下载安装mysql:

下载地址:https://downloads.mysql.com/archives/community/

1
2
3
4
5
# yum install -y gcc gcc-c++ openssl openssl-devel libaio libaio-devel ncurses ncurses-devel
# cd /usr/local/src/
# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz
# tar -xJvf mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz
# mv mysql-8.0.17-linux-glibc2.12-x86_64 /usr/local/mysql

添加环境变量:

1
2
3
# vim /etc/profile
# 尾行,添加变量
export PATH=$PATH:/usr/local/mysql/bin
1
2
3
# source /etc/profile
# mysql -V
mysql Ver 8.0.17 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

更改启动脚本:

1
2
3
4
# vim /usr/local/mysql/support-files/mysql.server
# 46~47行,修改配置
basedir=/usr/local/mysql
datadir=/data/mysql
1
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

mysql8的配置及数据初始化

mysql启动时注意:

  • 一般来说例如ginx、redis等,安装完配置一下就能启动。

  • mysql在启动前得进行数据的初始化。

  • mysql的初始化依赖于配置,所以得先把配置改好。

node1

修改mysql配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# vim /etc/my.cnf
[mysqld]
bind-address=127.0.0.1
port=3306
datadir=/data/mysql
user=mysql
skip-name-resolve
slow_query_log=1
long_query_time=1
slow_query_log_file=/data/mysql/mysql-slow.log
innodb-file-per-table=1
innodb_flush_log_at_trx_commit=2
max_allowed_packet=512M
connect_timeout=60
net_read_timeout=120

[mysqld_safe]
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid
  • bind-address:监听地址,优先级本机>内网>公网。

  • skip-name-resolve:使用IP,而不是主机名进行解析。

  • slow_query_log=on:开启慢查询。

  • slow_query_log_file:慢日志位置。

  • innodb-file-per-table=1:表示使用独立表空间。

  • innodb_flush_log_at_trx_commit=2:1表示数据立马写入磁盘,2表示每秒执行一次写盘的操作。

创建数据目录,修改权限:

1
2
3
# useradd mysql -s /sbin/nologin
# mkdir -p /data/mysql
# chown -R mysql:mysql /data/mysql/ /usr/local/mysql/

mysql数据的初始化:

1
# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql &> ~/passwd
  • –initialize:初始化。
  • –user=mysql:指定用户。
  • –basedir=/usr/local/mysql:指定安装目录。
  • –datadir=/data/mysql:指定数据目录。

查看初始化的文件,生成了初始化的一些数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ll -h /data/mysql
total 155M
-rw-r----- 1 mysql mysql 56 Dec 6 23:11 auto.cnf
-rw------- 1 mysql mysql 1.7K Dec 6 23:11 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Dec 6 23:11 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Dec 6 23:11 client-cert.pem
-rw------- 1 mysql mysql 1.7K Dec 6 23:11 client-key.pem
-rw-r----- 1 mysql mysql 5.8K Dec 6 23:11 ib_buffer_pool
-rw-r----- 1 mysql mysql 12M Dec 6 23:11 ibdata1
-rw-r----- 1 mysql mysql 48M Dec 6 23:11 ib_logfile0
-rw-r----- 1 mysql mysql 48M Dec 6 23:11 ib_logfile1
drwxr-x--- 2 mysql mysql 6 Dec 6 23:11 #innodb_temp
drwxr-x--- 2 mysql mysql 143 Dec 6 23:11 mysql
-rw-r----- 1 mysql mysql 26M Dec 6 23:11 mysql.ibd
-rw-r----- 1 mysql mysql 168 Dec 6 23:11 mysql-slow.log
drwxr-x--- 2 mysql mysql 8.0K Dec 6 23:11 performance_schema
-rw------- 1 mysql mysql 1.7K Dec 6 23:11 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Dec 6 23:11 public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Dec 6 23:11 server-cert.pem
-rw------- 1 mysql mysql 1.7K Dec 6 23:11 server-key.pem
drwxr-x--- 2 mysql mysql 28 Dec 6 23:11 sys
-rw-r----- 1 mysql mysql 10M Dec 6 23:11 undo_001
-rw-r----- 1 mysql mysql 10M Dec 6 23:11 undo_002

mysql8服务器的启动

启动mysql服务器:

  • 脚本启动:/etc/init.d/mysqld start

  • 脚本关闭:/etc/init.d/mysqld stop

  • 手工启动:nohup mysqld_safe –defaultsfile=/etc/my.cnf &

  • 手工关闭:kill

node1

查看密码:

1
2
# grep password ~/passwd
2023-12-06T15:11:09.255822Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >i_Nt=kCf6:6

systemctl管理mysql:

1
2
3
4
5
6
7
8
9
10
11
# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target

[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start

[Install]
WantedBy=multi-user.target

启动mysql,设置开机自启:

1
2
3
# systemctl start mysqld
# systemctl enable mysqld
# systemctl status mysqld

查看端口和进程:

1
2
3
4
5
6
7
# netstat -tlunp | grep mysql
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 8550/mysqld
tcp6 0 0 :::33060 :::* LISTEN 8550/mysqld
# ps -ef | grep mysql
root 8280 1 0 23:13 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/node1.pid
mysql 8550 8280 3 23:13 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysqld.log --pid-file=/data/mysql/node1.pid --port=3306
root 8617 8088 0 23:14 pts/0 00:00:00 grep --color=auto mysql

查看日志:

1
# tail -f /data/mysql/mysqld.log

mysql客户端和数据库的操作

mysql客户端操作。

  • linux客户端,mysql命令,运维常用 。

  • windows客户端,界面操作 。

  • 网站客户端phpmyadmin,需要搭建lnmp环境 。

  • 程序操作mysql数据库,需要学习编程。

node1

linux的mysql客户端登录:

1
2
# grep 'password' ~/passwd
2023-12-06T15:11:09.255822Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >i_Nt=kCf6:6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mysql -uroot -p'>i_Nt=kCf6:6' -A
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> quit
Bye
  • -u:指定用户。

  • -p:指定需要输入密码。

  • -A:取消命令提示,使用tab不会有命令提示。

  • -h:指定登录到哪台主机,默认使用localhost。

  • -S:指定使用哪个socket,针对socket放置在不同位置的。

配置socket在非/tmp目录:

1
2
3
4
# cp /etc/my.cnf /etc/my.cnf.bak
# vim /etc/my.cnf
# 尾行,添加配置
socket=/data/mysql/mysql.sock
1
# systemctl restart mysqld

重新登录失败,需要指定socket:

1
2
3
# mysql -uroot -p'>i_Nt=kCf6:6' -A
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
1
2
3
# mysql -uroot -p'>i_Nt=kCf6:6' -A -S /data/mysql/mysql.sock

mysql> quit

删除socket配置:

1
2
# \cp /etc/my.cnf.bak /etc/my.cnf
# systemctl restart mysqld

登录后需要重置密码才能使用数据库:

1
2
3
4
5
6
7
8
9
# mysql -uroot -p'>i_Nt=kCf6:6' -A

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> quit
1
# mysql -uroot -p123456 -A

mysql的操作说明:

  • 库—>表—>数据。

  • 多个库、多个表、多行数据。

  • 插入数据、删除数据、更新数据、获取数据。

显示所有数据库:

1
2
3
4
5
6
7
8
9
10
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)

创建sqlserver数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> create database sqlserver;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sqlserver |
| sys |
+--------------------+
5 rows in set (0.00 sec)

删除sqlserver数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> drop database sqlserver;
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)

mysql> quit

mysql表的创建和数值类型实战

mysql数据存储说明:

  • 数据库。

  • 表结构。

  • 数据。

node1

创建sqlserver_test数据表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# mysql -uroot -p123456 -A

mysql> create database sqlserver;
Query OK, 1 row affected (0.01 sec)

mysql> use sqlserver;
Database changed

mysql> create table sqlserver_test (id bigint, age int);
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+---------------------+
| Tables_in_sqlserver |
+---------------------+
| sqlserver_test |
+---------------------+
1 row in set (0.00 sec)

表结构创建说明:

  • 列名(字段)、数据类型需要预先想好。

  • 数据类型需要遵循一定的语法。

再创建sqlserver_test2数据表:

1
2
3
4
5
6
7
8
9
10
11
mysql> create table sqlserver_test2 (id bigint);
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+---------------------+
| Tables_in_sqlserver |
+---------------------+
| sqlserver_test |
| sqlserver_test2 |
+---------------------+
2 rows in set (0.00 sec)

表结构创建难点:

  • 需要提前规划好项目,是比较难的一部分。

  • 规划存储用户名、密码。后面又要加入年龄、城市等。

  • 用户名规划使用20个字符来存储,使用起来用户名有超过20个字符的。

数据类型种类:

  • 数值类型。

  • 字符串类型。

  • 日期时间类型。

  • 枚举类型等。

创建user表,int类型数据:

1
2
mysql> create table user (id int);
Query OK, 0 rows affected (0.01 sec)

查看表结构的两种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> desc user;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> show create table user;
+-------+----------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

删除其他表,只保留user表:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> drop table sqlserver_test;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table sqlserver_test2;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+---------------------+
| Tables_in_sqlserver |
+---------------------+
| user |
+---------------------+
1 row in set (0.00 sec)

user表插入数据,显示超出范围,数据没有插入成功:

1
2
3
4
5
mysql> insert into user (id) values (11111111111111111111);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

mysql> select * from user;
Empty set (0.00 sec)

设置非严格模式来验证能存储:

1
2
mysql> set sql_mode=ANSI;
Query OK, 0 rows affected (0.00 sec)

int,4字节,一字节8位,只有正数,不算0,最大值2147483647。2^32÷2-1=2147483647:

1
2
3
4
5
6
7
8
9
10
mysql> insert into user (id) values (11111111111111111111);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+------------+
| id |
+------------+
| 2147483647 |
+------------+
1 row in set (0.00 sec)

bigint类型数据,最大9223372036854775807,不能存小数,最大值2^64÷2-1=9223372036854775807,如果插入小数,四舍五入保留整数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user (id bigint);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into user (id) values (11111111111111111111);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+---------------------+
| id |
+---------------------+
| 9223372036854775807 |
+---------------------+
1 row in set (0.00 sec)

int不能存储浮点数:

1
2
3
4
5
6
7
8
9
10
11
mysql> insert into user (id) values (5.5);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+---------------------+
| id |
+---------------------+
| 9223372036854775807 |
| 6 |
+---------------------+
2 rows in set (0.00 sec)

float数据,此时可以存储小数,也可以存更大的整数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> drop table user;
Query OK, 0 rows affected (0.00 sec)

mysql> create table user (id float);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user (id) values (5.5);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id) values (11111111111111111111);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+------------+
| id |
+------------+
| 5.5 |
| 1.11111e19 |
+------------+
2 rows in set (0.00 sec)

unsigned使用说明:

  • 默认数值类似能存正负数。

  • 使用unsigned关键字只存正数。

init可以存储正数和负数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> drop table user;
Query OK, 0 rows affected (0.02 sec)

mysql> create table user (id int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into user (id) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id) values (-1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+------+
| id |
+------+
| 1 |
| -1 |
+------+
2 rows in set (0.00 sec)

unsigned只存正数,最大值4294967295:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
mysql> drop table user;
Query OK, 0 rows affected (0.00 sec)

mysql> create table user (id int unsigned);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user (id) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id) values (-1);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+------+
| id |
+------+
| 1 |
| 0 |
+------+
2 rows in set (0.00 sec)

mysql> insert into user (id) values (11111111111111111111);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+------------+
| id |
+------------+
| 1 |
| 0 |
| 4294967295 |
+------------+
3 rows in set (0.00 sec)

常用数值类型:

  • tinyint:整型1字节。

  • smallint:整型2字节。

  • mediumint:整型3字节。

  • int:整型4字节。

  • bigint:整型8字节。

  • float:浮点数整型无小数点。

  • double:双浮点数。

mysql字符串类型和日期类型

字符串类型:

  • char:定长字符串。

  • varchar:变长字符串。

  • text:长文本数据。

  • mediumtext:中长文本数据。

  • longtext:极大长文本数据。

node1

定长字符串插入:会截取尾部空格:

1
2
3
4
5
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user (name char(20));
Query OK, 0 rows affected (0.00 sec)

自动截断尾部空格,超过20个字符会截断尾部:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> insert into user (name) values ('beijinghuanyingni      ');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (name) values ('beijinghuanyingni');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+-------------------+
| name |
+-------------------+
| beijinghuanyingni |
| beijinghuanyingni |
+-------------------+
2 rows in set (0.00 sec)

mysql> insert into user (name) values ('1234567890123456789012345');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+----------------------+
| name |
+----------------------+
| beijinghuanyingni |
| beijinghuanyingni |
| 12345678901234567890 |
+----------------------+
3 rows in set (0.00 sec)

变长字符串插入:依赖于插入的数据长度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> drop table user;
Query OK, 0 rows affected (0.02 sec)

mysql> create table user (name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user (name) values ('beijinghuanyingni');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+-------------------+
| name |
+-------------------+
| beijinghuanyingni |
+-------------------+
1 row in set (0.00 sec)

如果varchar定义过长,会自动转换成其他类型数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> drop table user;
Query OK, 0 rows affected (0.02 sec)

mysql> create table user (name varchar(200000));
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show create table user;
+-------+---------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------+
| user | CREATE TABLE "user" (
"name" mediumtext
) |
+-------+---------------------------------------------+
1 row in set (0.00 sec)

日期和时间类型:

  • 日期类型date,YYYY-MM-DD。

  • 时间类型time,HH:MM:SS。

  • 年类型year,YYYY。

  • 日期时间类型datetime,YYYY-MM-DD HH:MM:SS。

插入数据验证:

1
2
3
4
5
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user (birth datetime);
Query OK, 0 rows affected (0.01 sec)

插入当前时间:

1
2
3
4
5
6
7
8
9
10
mysql> insert into user (birth) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+---------------------+
| birth |
+---------------------+
| 2023-02-26 00:35:05 |
+---------------------+
1 row in set (0.00 sec)

插入指定时间:

1
2
3
4
5
6
7
8
9
10
11
mysql> insert into user (birth) values ('2020-01-01 11:22:33');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+---------------------+
| birth |
+---------------------+
| 2023-12-06 23:27:52 |
| 2020-01-01 11:22:33 |
+---------------------+
2 rows in set (0.00 sec)

插入错误时间,插入0数据,之前设置了非严格模式:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> insert into user (birth) values ('2020-01-01 11:22:62');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+---------------------+
| birth |
+---------------------+
| 2023-12-06 23:27:52 |
| 2020-01-01 11:22:33 |
| 0000-00-00 00:00:00 |
+---------------------+
3 rows in set (0.00 sec)

枚举类型,指定存储类型,非指定数据为空:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user (size enum('small', 'medium', 'large'));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user (size) values ('small');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+-------+
| size |
+-------+
| small |
+-------+
1 row in set (0.00 sec)

mysql> insert into user (size) values ('aaa');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from user;
+-------+
| size |
+-------+
| small |
| |
+-------+
2 rows in set (0.00 sec)

mysql数据表的主键和自增

node1

创建数据库:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> drop table user;
Query OK, 0 rows affected (0.02 sec)

mysql> use sqlserver;
Database changed

mysql> create table user(
id bigint unsigned not null,
username varchar(100) not null,
password varchar(100) not null
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

准备数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> insert into user (id,username,password) values (1,'student','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id,username,password) values (1,'student','red');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | red |
| 1 | student | red |
+----+----------+----------+
2 rows in set (0.00 sec)

主键介绍:

  • 主键:一张表只能有一个主键。

  • 主键的值是唯一的,不能重复。

  • 主键语法:primary key (id)。

重新定义带有主键的数据表:

1
2
3
4
5
6
7
8
9
10
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user(
id bigint unsigned not null,
username varchar(100) not null,
password varchar(100) not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据,第二次插入数据报错,主键重复,插入失败不消耗主键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> insert into user (id,username,password) values (1,'student','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id,username,password) values (1,'student','red');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | red |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> insert into user (id,username,password) values (2,'student','red');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | red |
| 2 | student | red |
+----+----------+----------+
2 rows in set (0.00 sec)

自增介绍:

  • 让值从1开始自己增长,插入的时候不关心其值。

  • 自增语法:id bigint unsigned not null auto_increment。

自增注意:

  • 自增建议使用bigint unsigned,溢出的可能性小。

  • int线上使用会出现溢出的情况,int数值上线值较低,容易到极限。

自增主键数据表:

1
2
3
4
5
6
7
8
9
10
mysql> drop table user;
Query OK, 0 rows affected (0.00 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> insert into user (username,password) values ('student','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('teacher','red');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | red |
| 2 | teacher | red |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> insert into user (username,password) values ('teacher','red');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | red |
| 2 | teacher | red |
| 3 | teacher | red |
+----+----------+----------+
3 rows in set (0.00 sec)

如果中间跳过一段数字,会接着递增:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> insert into user (id,username,password) values (100,'teacher','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('student','red');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+-----+----------+----------+
| id | username | password |
+-----+----------+----------+
| 1 | student | red |
| 2 | teacher | red |
| 3 | teacher | red |
| 100 | teacher | red |
| 101 | student | red |
+-----+----------+----------+
5 rows in set (0.00 sec)

mysql数据表的unique键

唯一键说明:

  • 唯一键表示值不能重复。

  • 唯一键可以有多个。

node1

创建唯一键数据表:

1
2
3
4
5
6
7
8
9
10
11
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id),
unique key (username)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据,username不能重复,插入失败消耗主键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> insert into user (username,password) values ('teacher','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('teacher','red');
ERROR 1062 (23000): Duplicate entry 'teacher' for key 'username'

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> insert into user (username,password) values ('student','red');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 3 | student | red |
+----+----------+----------+
2 rows in set (0.00 sec)

创建多个唯一键数据表:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id),
unique key (username),
unique key (password)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据,两个都不能重复,插入失败消耗主键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> insert into user (username,password) values ('teacher','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('student','blue');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 2 | student | blue |
+----+----------+----------+
2 rows in set (0.00 sec)

创建多个唯一键不能同时一样数据表,一个字段不同就行:

1
2
3
4
5
6
7
8
9
10
11
mysql> drop table user;
Query OK, 0 rows affected (0.00 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id),
unique key name_pass (username, password)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据,插入失败消耗主键,id顺序不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> insert into user (username,password) values ('teacher','red');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (username,password) values ('teacher','yellow');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('student','yellow');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (username,password) values ('teacher','red');
ERROR 1062 (23000): Duplicate entry 'teacher-red' for key 'name_pass'

mysql> insert into user (username,password) values ('student','green');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 5 | student | green |
| 3 | student | yellow |
| 1 | teacher | red |
| 2 | teacher | yellow |
+----+----------+----------+
4 rows in set (0.00 sec)

mysql插入数据语法

mysql常用的数据操作:

  • 插入数据。

  • 删除数据。

  • 修改数据。

  • 查询数据。

node1

创建示例user表:

1
2
3
4
5
6
7
8
9
10
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据,指定字段插入:

1
2
3
4
5
6
7
8
9
10
mysql> insert into user (username,password) values ('teacher','red');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
+----+----------+----------+
1 row in set (0.00 sec)

插入数据,不指定字段插入,用的较少,表结构改变会变得麻烦:

1
2
3
4
5
6
7
8
9
10
11
mysql> insert into user values (null,'student','yellow');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 2 | student | yellow |
+----+----------+----------+
2 rows in set (0.01 sec)

插入数据注意事项:

  • 最好指定字段插入,预防表结构更改。

-自增的字段不需要人工干预。

快速生成批量数据,指数级别增加,可以用来测试分页、索引等功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> insert into user (username,password) select username,password from user;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 8 rows affected (0.00 sec)
Records: 8 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 16 rows affected (0.00 sec)
Records: 16 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 32 rows affected (0.00 sec)
Records: 32 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 64 rows affected (0.01 sec)
Records: 64 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 128 rows affected (0.00 sec)
Records: 128 Duplicates: 0 Warnings: 0

mysql> select * from user;

插入多个数据:

1
2
3
4
5
mysql> insert into user (username,password) values ('classmate','black'), ('document', 'pink');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from user;

mysql查询数据语法

node1

查看数据:

1
mysql> select * from user;

限制输出条数:

1
2
3
4
5
6
7
8
9
10
11
mysql> select * from user limit 5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 2 | student | yellow |
| 3 | teacher | red |
| 4 | student | yellow |
| 6 | teacher | red |
+----+----------+----------+
5 rows in set (0.00 sec)

指定字段查询:

1
2
3
4
5
6
7
8
9
10
11
mysql> select id,username from user limit 5;
+----+----------+
| id | username |
+----+----------+
| 1 | teacher |
| 2 | student |
| 3 | teacher |
| 4 | student |
| 6 | teacher |
+----+----------+
5 rows in set (0.00 sec)

查看表的数据量:

1
2
3
4
5
6
7
mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
| 258 |
+----------+
1 row in set (0.05 sec)

mysql查询语法:

  • select 字段 from 表名 where 条件 limit 限制条数。

  • *代表所有字段。

  • limit限制查询条数。

限制条数中的分页实战,查询5条:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mysql> select * from user limit 0,5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 2 | student | yellow |
| 3 | teacher | red |
| 4 | student | yellow |
| 6 | teacher | red |
+----+----------+----------+
5 rows in set (0.00 sec)

mysql> select * from user limit 5,5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 7 | student | yellow |
| 8 | teacher | red |
| 9 | student | yellow |
| 13 | teacher | red |
| 14 | student | yellow |
+----+----------+----------+
5 rows in set (0.00 sec)

mysql> select * from user limit 10,5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 15 | teacher | red |
| 16 | student | yellow |
| 17 | teacher | red |
| 18 | student | yellow |
| 19 | teacher | red |
+----+----------+----------+
5 rows in set (0.01 sec)

mysql> select * from user limit 15,5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 20 | student | yellow |
| 28 | teacher | red |
| 29 | student | yellow |
| 30 | teacher | red |
| 31 | student | yellow |
+----+----------+----------+
5 rows in set (0.00 sec)

条件之数字对比:

  • =等于,<小于,>大于,>=大于等于,!=不等于。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> select * from user where id=1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
+----+----------+----------+
1 row in set (0.01 sec)

mysql> select * from user where id<=13;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 2 | student | yellow |
| 3 | teacher | red |
| 4 | student | yellow |
| 6 | teacher | red |
| 7 | student | yellow |
| 8 | teacher | red |
| 9 | student | yellow |
| 13 | teacher | red |
+----+----------+----------+
9 rows in set (0.00 sec)

条件之字符串匹配:

  • =:等于。
  • !=:不等于。
1
mysql> select * from user where username='student';

多条件查询:

  • and多条件同时满足。

  • or只需要满足其中一个条件。

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user where username='student' and id <10;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 2 | student | yellow |
| 4 | student | yellow |
| 7 | student | yellow |
| 9 | student | yellow |
+----+----------+----------+
4 rows in set (0.00 sec)

mysql> select * from user where id<10 or username='teacher';

like模糊查询,匹配:

  • %:匹配任意多个字符。

  • _:代表匹配任意单个字符。

1
2
3
4
5
mysql> select * from user where username like 'tea%';

mysql> select * from user where username like '%t%';

mysql> select * from user where username like '%den_';

in查询,指定:

1
2
3
4
5
6
7
8
9
10
mysql> select * from user where id in (1,2);
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | red |
| 2 | student | yellow |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from user where username in ('student','yellow');

mysql中的null类型

node1

创建myuser表,测试null类型:

1
2
3
4
5
6
7
mysql> create table myuser(
id bigint unsigned not null auto_increment,
username varchar(100),
password varchar(100),
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

数据插入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> insert into myuser (username,password) values (null,null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into myuser (username,password) values ('classmate','black');
Query OK, 1 row affected (0.00 sec)

mysql> select * from myuser;
+----+-----------+----------+
| id | username | password |
+----+-----------+----------+
| 1 | NULL | NULL |
| 2 | classmate | black |
+----+-----------+----------+
2 rows in set (0.00 sec)

null的数据查询,=和!=查询无效,使用is和is not:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * from myuser where username=null;
Empty set (0.00 sec)

mysql> select * from myuser where username!=null;
Empty set (0.00 sec)

mysql> select * from myuser where username is null;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | NULL | NULL |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> select * from myuser where username is not null;
+----+-----------+----------+
| id | username | password |
+----+-----------+----------+
| 2 | classmate | black |
+----+-----------+----------+
1 row in set (0.00 sec)

插入数据时指定id为null,id是自增,其他值为null:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> insert into myuser (id) values (null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from myuser;
+----+-----------+----------+
| id | username | password |
+----+-----------+----------+
| 1 | NULL | NULL |
| 2 | classmate | black |
| 3 | NULL | NULL |
+----+-----------+----------+
3 rows in set (0.00 sec)

创建myuser表,测试空字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> drop table myuser;
Query OK, 0 rows affected (0.01 sec)

mysql> create table myuser(
id bigint unsigned not null auto_increment,
username varchar(100) default '',
password varchar(100) default '',
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into myuser (id) values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from myuser;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | | |
+----+----------+----------+
1 row in set (0.00 sec)

空字符串能正常获取:

1
2
3
4
5
6
7
mysql> select * from myuser where username='';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | | |
+----+----------+----------+
1 row in set (0.00 sec)

mysql更新和删除语法

更新语法:

  • update 表名 set 字段 = 更改值 where 条件;。

  • 一般先select,再update。

  • 条件一定要加,不然就全表更新了,很危险。

node1

修改user表数据,不添加where会全部修改:

1
2
3
4
5
6
7
mysql> select * from user;

mysql> update user set password='color';
Query OK, 258 rows affected (0.01 sec)
Rows matched: 258 Changed: 258 Warnings: 0

mysql> select * from user;

最好先查找再修改,最好用主键查找:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> select * from user where id=1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | color |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> update user set password='orange' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from user limit 5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | teacher | orange |
| 2 | student | color |
| 3 | teacher | color |
| 4 | student | color |
| 6 | teacher | color |
+----+----------+----------+
5 rows in set (0.00 sec)

删除语法:

  • delete from 表名 where 条件。

  • 建议先select,后delete。

  • 条件一定要加,不然就全删除了。

删除id大于50的:

1
2
3
4
5
6
mysql> select * from user where id>100;

mysql> delete from user where id>100;
Query OK, 194 rows affected (0.00 sec)

mysql> select * from user;

删除username=teacher的:

1
2
3
4
mysql> delete from user where username='teacher';
Query OK, 32 rows affected (0.00 sec)

mysql> select * from user;

清空表数据,保留自增id:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> delete from user;
Query OK, 32 rows affected (0.01 sec)

mysql> insert into user (username,password) values ('classmate','white');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+-----+-----------+----------+
| id | username | password |
+-----+-----------+----------+
| 506 | classmate | white |
+-----+-----------+----------+
1 row in set (0.00 sec)

清空表数据,自增id重置:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> truncate table user;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into user (username,password) values ('classmate','white');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+-----------+----------+
| id | username | password |
+----+-----------+----------+
| 1 | classmate | white |
+----+-----------+----------+
1 row in set (0.00 sec)

mysql查询排序和分组查询

查询排序:

  • 升序:select * from user order by id asc;

  • 降序:select * from user order by id desc;

  • 通过名字:select * from user order by learntype;

  • 多列排序:select * from user order by learntype asc,grade desc;

node1

创建查询表:

1
2
3
4
5
6
7
8
9
10
11
mysql> drop table user;
Query OK, 0 rows affected (0.00 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
learntype varchar(100) not null,
grade int not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.00 sec)

插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> insert into user (username,learntype,grade) values('teacher','c',80);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,learntype,grade) values('teacher','python',93);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,learntype,grade) values('student','c',76);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,learntype,grade) values('student','python',88);
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (username,learntype,grade) values('classmate','c',87);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,learntype,grade) values('classmate','python',65);
Query OK, 1 row affected (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user;
+----+-----------+-----------+-------+
| id | username | learntype | grade |
+----+-----------+-----------+-------+
| 1 | teacher | c | 80 |
| 2 | teacher | python | 93 |
| 3 | student | c | 76 |
| 4 | student | python | 88 |
| 5 | classmate | c | 87 |
| 6 | classmate | python | 65 |
+----+-----------+-----------+-------+
6 rows in set (0.00 sec)

升序,id:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user order by id;
+----+-----------+-----------+-------+
| id | username | learntype | grade |
+----+-----------+-----------+-------+
| 1 | teacher | c | 80 |
| 2 | teacher | python | 93 |
| 3 | student | c | 76 |
| 4 | student | python | 88 |
| 5 | classmate | c | 87 |
| 6 | classmate | python | 65 |
+----+-----------+-----------+-------+
6 rows in set (0.00 sec)

降序,id:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user order by id desc;
+----+-----------+-----------+-------+
| id | username | learntype | grade |
+----+-----------+-----------+-------+
| 6 | classmate | python | 65 |
| 5 | classmate | c | 87 |
| 4 | student | python | 88 |
| 3 | student | c | 76 |
| 2 | teacher | python | 93 |
| 1 | teacher | c | 80 |
+----+-----------+-----------+-------+
6 rows in set (0.00 sec)

升序,learntype:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user order by learntype;
+----+-----------+-----------+-------+
| id | username | learntype | grade |
+----+-----------+-----------+-------+
| 1 | teacher | c | 80 |
| 3 | student | c | 76 |
| 5 | classmate | c | 87 |
| 2 | teacher | python | 93 |
| 4 | student | python | 88 |
| 6 | classmate | python | 65 |
+----+-----------+-----------+-------+
6 rows in set (0.00 sec)

升序,learntype,grade:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user order by learntype,grade;
+----+-----------+-----------+-------+
| id | username | learntype | grade |
+----+-----------+-----------+-------+
| 3 | student | c | 76 |
| 1 | teacher | c | 80 |
| 5 | classmate | c | 87 |
| 6 | classmate | python | 65 |
| 4 | student | python | 88 |
| 2 | teacher | python | 93 |
+----+-----------+-----------+-------+
6 rows in set (0.00 sec)

learntype,升序,grade,降序:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select * from user order by learntype asc,grade desc;
+----+-----------+-----------+-------+
| id | username | learntype | grade |
+----+-----------+-----------+-------+
| 5 | classmate | c | 87 |
| 1 | teacher | c | 80 |
| 3 | student | c | 76 |
| 2 | teacher | python | 93 |
| 4 | student | python | 88 |
| 6 | classmate | python | 65 |
+----+-----------+-----------+-------+
6 rows in set (0.00 sec)

统计最大id:

1
2
3
4
5
6
7
mysql> select max(id) from user;
+---------+
| max(id) |
+---------+
| 6 |
+---------+
1 row in set (0.00 sec)

统计最小id:

1
2
3
4
5
6
7
mysql> select min(id) from user;
+---------+
| min(id) |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)

统计平均id:

1
2
3
4
5
6
7
mysql> select avg(id) from user;
+---------+
| avg(id) |
+---------+
| 3.5000 |
+---------+
1 row in set (0.00 sec)

统计id和:

1
2
3
4
5
6
7
mysql> select sum(id) from user;
+---------+
| sum(id) |
+---------+
| 21 |
+---------+
1 row in set (0.00 sec)

总分,并排序:

1
2
3
4
5
6
7
8
9
mysql> select username,sum(grade) from user group by username order by sum(grade);
+-----------+------------+
| username | sum(grade) |
+-----------+------------+
| classmate | 152 |
| student | 164 |
| teacher | 173 |
+-----------+------------+
3 rows in set (0.00 sec)

平均分:

1
2
3
4
5
6
7
8
9
mysql> select username,avg(grade) from user group by username;
+-----------+------------+
| username | avg(grade) |
+-----------+------------+
| teacher | 86.5000 |
| student | 82.0000 |
| classmate | 76.0000 |
+-----------+------------+
3 rows in set (0.00 sec)

多少科:

1
2
3
4
5
6
7
8
9
mysql> select username,count(*) from user group by username;
+-----------+----------+
| username | count(*) |
+-----------+----------+
| teacher | 2 |
| student | 2 |
| classmate | 2 |
+-----------+----------+
3 rows in set (0.00 sec)

分组统计,以学科来分组:

1
2
3
4
5
6
7
8
mysql> select learntype,avg(grade) from user group by learntype;
+-----------+------------+
| learntype | avg(grade) |
+-----------+------------+
| c | 81.0000 |
| python | 82.0000 |
+-----------+------------+
2 rows in set (0.00 sec)

mysql多表组合查询

node1

删除之前的表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show tables;
+---------------------+
| Tables_in_sqlserver |
+---------------------+
| myuser |
| user |
+---------------------+
2 rows in set (0.01 sec)

mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> drop table myuser;
Query OK, 0 rows affected (0.01 sec)

创建关联表:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> create table user(
id bigint unsigned auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> create table logincount(
username varchar(100) not null,
count bigint unsigned not null
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

准备数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> insert into user (username,password) values ('one','red');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (username,password) values ('two','red');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('three','yellow');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('four','yellow');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | one | red |
| 2 | two | red |
| 3 | three | yellow |
| 4 | four | yellow |
+----+----------+----------+
4 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> insert into logincount (username,count) values ('one',10);
Query OK, 1 row affected (0.00 sec)

mysql> insert into logincount (username,count) values ('two',20);
Query OK, 1 row affected (0.01 sec)

mysql> insert into logincount (username,count) values ('three',50);
Query OK, 1 row affected (0.00 sec)

mysql> insert into logincount (username,count) values ('nono',90);
Query OK, 1 row affected (0.00 sec)

mysql> select * from logincount;
+----------+-------+
| username | count |
+----------+-------+
| one | 10 |
| two | 20 |
| three | 50 |
| nono | 90 |
+----------+-------+
4 rows in set (0.00 sec)

inner join,两张表共有:

1
2
3
4
5
6
7
8
9
mysql> select user.username,user.password,logincount.count from user inner join logincount on user.username=logincount.username;
+----------+----------+-------+
| username | password | count |
+----------+----------+-------+
| one | red | 10 |
| two | red | 20 |
| three | yellow | 50 |
+----------+----------+-------+
3 rows in set (0.00 sec)

left join,以左表为主:

1
2
3
4
5
6
7
8
9
10
mysql> select user.username,user.password,logincount.count from user left join logincount on user.username=logincount.username;
+----------+----------+-------+
| username | password | count |
+----------+----------+-------+
| one | red | 10 |
| two | red | 20 |
| three | yellow | 50 |
| four | yellow | NULL |
+----------+----------+-------+
4 rows in set (0.00 sec)

right join,以右表为主:

1
2
3
4
5
6
7
8
9
10
mysql> select user.username,user.password,logincount.count from user right join logincount on user.username=logincount.username;
+----------+----------+-------+
| username | password | count |
+----------+----------+-------+
| one | red | 10 |
| two | red | 20 |
| three | yellow | 50 |
| NULL | NULL | 90 |
+----------+----------+-------+
4 rows in set (0.00 sec)

mysql正则查询实战

正则表达式:

  • 约定好的符号去表示某个含义。

  • 例如.表示任意单个字符。

  • 约定好的符号当成普通字符使用。

普通正则表达式:

符号含义
.表示任意一个字符
*表示前面一个字符出现0次或者多次
[abc]表示中括号内任意一个字符
[^abc]表示非中括号内的字符
[0-9]表示数字
[a-z]表示小写字母
[A-Z]表示大写字母
^xx示以xx开头
xx$表示以xx结尾
[a-zA-Z]表示所有字母
[a-zA-Z0-9]表示所有字母+数字
\d表示数字
\D表示非数字
\s表示空白字符
\S表示非空白字符

扩展正则表达式:

符号含义
?表示前面字符出现0或者1次
+表示前面字符出现1或者多次
{a}表示前面字符匹配a次
{a,b}表示前面字符匹配a到b次
{,b}表示前面字符匹配0次到b次
{a,}前面字符匹配a或a+次
string1|string2表示匹配string1或者string2

node1

查询数据:

1
2
3
4
5
6
7
8
9
10
mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | one | red |
| 2 | two | red |
| 3 | three | yellow |
| 4 | four | yellow |
+----+----------+----------+
4 rows in set (0.00 sec)

正则匹配,带r:

1
2
3
4
5
6
7
8
mysql> select * from user where username regexp 'r';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 3 | three | yellow |
| 4 | four | yellow |
+----+----------+----------+
2 rows in set (0.01 sec)

正则匹配,t开头:

1
2
3
4
5
6
7
8
mysql> select * from user where username regexp '^t';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 2 | two | red |
| 3 | three | yellow |
+----+----------+----------+
2 rows in set (0.00 sec)

正则匹配,e结尾:

1
2
3
4
5
6
7
8
mysql> select * from user where username regexp 'e$';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | one | red |
| 3 | three | yellow |
+----+----------+----------+
2 rows in set (0.00 sec)

扩展正则:

1
2
3
4
5
6
7
8
9
mysql> select * from user where username regexp 'e$|two';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | one | red |
| 2 | two | red |
| 3 | three | yellow |
+----+----------+----------+
3 rows in set (0.00 sec)

mysql的事务操作实战

node1

建立事务表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> drop table logincount;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
money int unsigned not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> insert into user (username,password,money) values ('teacher','mypwd',10000);
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (username,password,money) values ('student','mypwd',10000);
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 10000 |
| 2 | student | mypwd | 10000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

mysql的事务:

  • 事务可以由一个或者多个操作组成。

  • 事务就是把一个或多个操作捆绑在一起。

  • 事务还有一个功能就是预防部分误操作。

事务自动提交:数据的更新立即生效,无法回滚。

默认mysql开启事务自动提交,autocommit是ON:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> show variables like '%commit%';
+-----------------------------------------+-------------------+
| Variable_name | Value |
+-----------------------------------------+-------------------+
| autocommit | ON |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_order_commits | ON |
| innodb_api_bk_commit_interval | 5 |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 2 |
| original_commit_timestamp | 36028797018963968 |
| slave_preserve_commit_order | OFF |
+-----------------------------------------+-------------------+
9 rows in set (0.00 sec)

关闭当前窗口事务自动提交,删除user表,不commit提交:

1
2
3
4
5
6
7
8
mysql> set autocommit=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from user;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from user;
Empty set (0.00 sec)

新建终端,user表还存在:

1
2
3
4
5
6
7
8
9
10
11
12
13
# mysql -uroot -p123456 -A

mysql> use sqlserver;
Database changed

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 10000 |
| 2 | student | mypwd | 10000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

旧终端commit提交后,user表彻底删除:

1
2
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

新终端user表已删除:

1
2
mysql> select * from user;
Empty set (0.00 sec)

新终端插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> insert into user (username,password,money) values ('teacher','mypwd',10000);
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (username,password,money) values ('student','mypwd',10000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 3 | teacher | mypwd | 10000 |
| 4 | student | mypwd | 10000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

旧终端插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> insert into user (username,password,money) values ('teacher','mypwd',10000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password,money) values ('student','mypwd',10000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 3 | teacher | mypwd | 10000 |
| 4 | student | mypwd | 10000 |
| 5 | teacher | mypwd | 10000 |
| 6 | student | mypwd | 10000 |
+----+----------+----------+-------+
4 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

新终端数据同步:

1
2
3
4
5
6
7
8
9
10
mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 3 | teacher | mypwd | 10000 |
| 4 | student | mypwd | 10000 |
| 5 | teacher | mypwd | 10000 |
| 6 | student | mypwd | 10000 |
+----+----------+----------+-------+
4 rows in set (0.00 sec)

旧终端删除user表,rollback回滚:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> delete from user;
Query OK, 4 rows affected (0.00 sec)

mysql> select * from user;
Empty set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 3 | teacher | mypwd | 10000 |
| 4 | student | mypwd | 10000 |
| 5 | teacher | mypwd | 10000 |
| 6 | student | mypwd | 10000 |
+----+----------+----------+-------+
4 rows in set (0.00 sec)

drop不可回滚:

1
2
3
4
5
6
7
8
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
ERROR 1146 (42S02): Table 'sqlserver.user' doesn't exist

再次建表操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
money int unsigned not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user (username,password,money) values ('teacher','mypwd',10000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password,money) values ('student','mypwd',10000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 10000 |
| 2 | student | mypwd | 10000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

commit提交:

1
2
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

新终端可以查看数据:

1
2
3
4
5
6
7
8
mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 10000 |
| 2 | student | mypwd | 10000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

旧终端多个操作组成一个事务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> set autocommit=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 10000 |
| 2 | student | mypwd | 10000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

mysql> update user set money=5000 where username='teacher';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update user set money=15000 where username='student';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 5000 |
| 2 | student | mypwd | 15000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

commit提交:

1
2
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

新终端可以查看数据:

1
2
3
4
5
6
7
8
mysql> select * from user;
+----+----------+----------+-------+
| id | username | password | money |
+----+----------+----------+-------+
| 1 | teacher | mypwd | 5000 |
| 2 | student | mypwd | 15000 |
+----+----------+----------+-------+
2 rows in set (0.00 sec)

mysql更改表结构实战

node1

创建新的user表:

1
2
3
4
5
6
7
8
9
10
mysql> drop table user;
Query OK, 0 rows affected (0.01 sec)

mysql> create table user(
id bigint unsigned not null auto_increment,
username varchar(20) not null,
password varchar(100) not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

更改表结构需求:

  • 添加字段,例如用户表新增存款字段。

  • 字段长度不足,例如用户名20位不够存储。

增加money字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> alter table user add money bigint unsigned;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
| money | bigint(20) unsigned | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

删除money字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> alter table user drop money;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

指定位置新增字段,username之后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> alter table user add money bigint unsigned default 0 after username;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| money | bigint(20) unsigned | YES | | 0 | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

删除money字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> alter table user drop money;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

加入到第一个字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> alter table user add money int unsigned default 0 first;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| money | int(10) unsigned | YES | | 0 | |
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

money改成bigint类型字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> alter table user modify money bigint unsigned default 0;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| money | bigint(20) unsigned | YES | | 0 | |
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

username改成varchar(100)类型字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> alter table user modify username varchar(100) not null default '';
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| money | bigint(20) unsigned | YES | | 0 | |
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(100) | NO | | | |
| password | varchar(100) | NO | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql的索引实战

索引说明:

  • mysql默认字段是没有索引的。

  • 加索引大多情况下可以加快数据的查询,相当于目录。

  • 数据变化不多不建议添加索引,如性别,数据经常更新不建议添加索引。

node1

创建user表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> drop table user;
Query OK, 0 rows affected (0.02 sec)

mysql> create table user (
id bigint unsigned not null auto_increment,
username varchar(100) not null,
password varchar(100) not null,
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into user (username,password) values ('student','mypwd');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('friend','mypwd');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (username,password) values ('classmate','mypwd');
Query OK, 1 row affected (0.00 sec)

批量准备数据,百万条数据(19次命令):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
mysql> insert into user (username,password) select username,password from user;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 12 rows affected (0.00 sec)
Records: 12 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 24 rows affected (0.00 sec)
Records: 24 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 48 rows affected (0.00 sec)
Records: 48 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 96 rows affected (0.00 sec)
Records: 96 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 192 rows affected (0.00 sec)
Records: 192 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 384 rows affected (0.01 sec)
Records: 384 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 768 rows affected (0.01 sec)
Records: 768 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 1536 rows affected (0.02 sec)
Records: 1536 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 3072 rows affected (0.03 sec)
Records: 3072 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 6144 rows affected (0.10 sec)
Records: 6144 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 12288 rows affected (0.10 sec)
Records: 12288 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 24576 rows affected (0.17 sec)
Records: 24576 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 49152 rows affected (0.36 sec)
Records: 49152 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 98304 rows affected (0.75 sec)
Records: 98304 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 196608 rows affected (1.54 sec)
Records: 196608 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 393216 rows affected (3.13 sec)
Records: 393216 Duplicates: 0 Warnings: 0

mysql> insert into user (username,password) select username,password from user;
Query OK, 786432 rows affected (5.94 sec)
Records: 786432 Duplicates: 0 Warnings: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
| 1572864 |
+----------+
1 row in set (0.17 sec)

mysql> select * from user limit 5;
+----+-----------+----------+
| id | username | password |
+----+-----------+----------+
| 1 | student | mypwd |
| 2 | friend | mypwd |
| 3 | classmate | mypwd |
| 4 | student | mypwd |
| 5 | friend | mypwd |
+----+-----------+----------+
5 rows in set (0.00 sec)

插入数据:

1
2
mysql> insert into user (username,password) values ('special','mypwd');
Query OK, 1 row affected (0.01 sec)

查询数据,超过0.5sec就很长了:

1
2
3
4
5
6
7
8
9
mysql> select * from user where username='special';
+---------+----------+----------+
| id | username | password |
+---------+----------+----------+
| 1834967 | special | mypwd |
+---------+----------+----------+
1 row in set (0.37 sec)

mysql> quit

修改慢日志时间,超过0.2秒记录日志:

1
2
3
# vim /etc/my.cnf
# 8行,修改配置
long_query_time=0.1
1
# systemctl restart mysqld

数据库查询:

1
2
3
4
5
6
7
8
9
10
11
12
# mysql -uroot -p123456 -A

mysql> use sqlserver;
Database changed

mysql> select * from user where username='special';
+---------+----------+----------+
| id | username | password |
+---------+----------+----------+
| 1834967 | special | mypwd |
+---------+----------+----------+
1 row in set (0.35 sec)

新建终端,有慢日志产生:

1
2
3
4
5
6
# tail -5 /data/mysql/mysql-slow.log
# User@Host: root[root] @ localhost [] Id: 8
# Query_time: 0.155384 Lock_time: 0.000840 Rows_sent: 1 Rows_examined: 1572865
use sqlserver;
SET timestamp=1701879345;
select * from user where username='special';

mysql数据添加索引,再次查询,秒出,只扫描一行。添加索引比较慢:

1
2
3
4
5
6
7
8
9
10
11
mysql> alter table user add index i_username (username);
Query OK, 0 rows affected (1.69 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select * from user where username='special';
+---------+----------+----------+
| id | username | password |
+---------+----------+----------+
| 1834967 | special | mypwd |
+---------+----------+----------+
1 row in set (0.00 sec)

查看扫描函数:

1
2
3
4
5
6
7
mysql> explain select * from user where username='special';
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | user | NULL | ref | i_username | i_username | 402 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

查看索引,主键和唯一键会默认创建索引,查看有哪些索引:

1
2
3
4
5
6
7
8
mysql> show indexes from user;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| user | 0 | PRIMARY | 1 | id | A | 1568959 | NULL | NULL | | BTREE | | | YES | NULL |
| user | 1 | i_username | 1 | username | A | 3 | NULL | NULL | | BTREE | | | YES | NULL |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
2 rows in set (0.01 sec)
  • 主键:一张表只能有一个,不能重复。

  • 唯一键:一张表能有多个,不能重复。

  • 索引,一张表可以有多个,可以重复。

  • 正则无法查询索引,更慢,全表扫描。

1
2
3
4
5
6
7
mysql> select * from user where username regexp 'special';
+---------+----------+----------+
| id | username | password |
+---------+----------+----------+
| 1834967 | special | mypwd |
+---------+----------+----------+
1 row in set (0.81 sec)

模糊查询可以查询索引:

1
2
3
4
5
6
7
8
9
mysql> select * from user where username like 'speci%';
+---------+----------+----------+
| id | username | password |
+---------+----------+----------+
| 1834967 | special | mypwd |
+---------+----------+----------+
1 row in set (0.00 sec)

mysql> quit

mysql的权限控制实战1

mysql监听说明:

  • 监听本地127.0.0.1,无风险。

  • 监听局域网,风险小,一般是监听在内网。

  • 监听公网,风险大,不设置权限容易被入侵。

node1

修改配置文件,监听公网,监听所有网卡0.0.0.0:

1
2
3
# vim /etc/my.cnf
# 2行,修改配置
bind-address=0.0.0.0
1
2
# systemctl restart mysqld
# systemctl status mysqld

权限信息表,mysql8默认只允许localhost登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# mysql -uroot -p123456 -A

mysql> use mysql;
Database changed

mysql> desc user;
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(255) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint(5) unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
| Create_role_priv | enum('N','Y') | NO | | N | |
| Drop_role_priv | enum('N','Y') | NO | | N | |
| Password_reuse_history | smallint(5) unsigned | YES | | NULL | |
| Password_reuse_time | smallint(5) unsigned | YES | | NULL | |
| Password_require_current | enum('N','Y') | YES | | NULL | |
| User_attributes | json | YES | | NULL | |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
51 rows in set (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

mysql添加用户,用户名testuser,密码password,允许本地登陆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> create user 'testuser'@'127.0.0.1' identified with mysql_native_password by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| testuser | 127.0.0.1 |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

testuser用户授权所有权限,默认没有权限:

1
2
3
4
5
mysql> grant all privileges on *.* to 'testuser'@'127.0.0.1' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
  • testuser:mysql用户名。

  • 127.0.0.1:允许访问mysql的IP,支持通配符,10.80.10.%。

  • all privileges:所有权限,可以制定权限,select、update。

  • * . *:所有库所有表,可以指定库指定表。

  • with grant option:能不能自己控制权限。

新建窗口,testuser登录数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# mysql -utestuser -p'password' -h127.0.0.1

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sqlserver |
| sys |
+--------------------+
5 rows in set (0.00 sec)

mysql> quit

设置密码使用mysql_native_password,mysql8使用新的加密方法caching_sha2_password,有的客户端可能不支持:

1
2
3
4
5
6
7
mysql> show variables like '%authen%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)

回收权限,再次登录权限受限:

1
2
3
4
5
mysql> revoke all privileges on *.* from 'testuser'@'127.0.0.1';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

用户删除:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> drop user 'testuser'@'127.0.0.1';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

mysql> quit

mysql的权限控制实战2

mysql图形化客户端:

  • navicat for mysql,需要注册破解,比较麻烦。

  • mysql workbench,可直接使用。

下载安装mysql workbench:

下载链接: https://dev.mysql.com/downloads/workbench/

1
https://downloads.mysql.com/archives/get/p/8/file/mysql-workbench-community-8.0.18-winx64.msi

自行安装mysql workbench默认下一步即可。

node1

创建用户,允许内网登录,赋予所有权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# mysql -uroot -p123456 -A

mysql> create user 'testuser'@'10.80.0.1' identified with mysql_native_password by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to 'testuser'@'10.80.0.1' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+--------------+
| user | host |
+------------------+--------------+
| testuser | 192.168.80.1 |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+--------------+
5 rows in set (0.00 sec)

mysql workbench连接数据库:

Database—>Connect to Database

1
2
3
Hostname:10.80.10.1
Username:testuser
Password:Store in Vault:password

进入主页:

在schemas查看数据库:

创建数据库:

1
2
mysql> create database linkserver;
Query OK, 1 row affected (0.01 sec)

mysql workbench右键refresh all刷新,左侧数据库进行选择sqlserver,输入sql,点击闪电标志执行:

1
select * from mysql.user;

1
select * from sqlserver.user limit 10;

权限sql说明:

  • client ip不建议直接给%,比较危险。

  • 权限可以细化,例如给select、update等。

  • with grant option代表给grant权限。

回收所有权限,赋予部分权限,指定数据库:

1
2
3
4
5
6
7
8
mysql> revoke all privileges on *.* from 'testuser'@'10.80.0.1';
Query OK, 0 rows affected (0.01 sec)

mysql> grant select,delete on sqltest.* to 'testuser'@'10.80.0.1' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql workbench重连数据库,无法查询其它数据库,没有权限。

再次赋予所有权限:

1
2
3
4
5
mysql> grant all privileges on *.* to 'testuser'@'10.80.0.1' with grant option;
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql workbench重连数据库,恢复正常。

实战权限控制注意:

  • 控制源ip,第一要点。最好不要使用%,%代表所有 ip都能登录到mysql。

  • 权限细化、范围细化(select,update,delete,insert)。

  • 运维一定要注意安全,特别是数据的安全。

mysql简单备份恢复实战

mysqldump备份数据库:

  • mysqldump会锁表,注意对业务的影响。

  • 数据量大不建议使用mysqldump,直接复制数据文件(停库)。

node1

创建user表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> use sqlserver;
Database changed

mysql> drop table user;
Query OK, 0 rows affected (0.11 sec)

mysql> create table user (
id bigint unsigned not null auto_increment,
username varchar(100),
password varchar(100),
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user (username,password) values ('student','mypwd'), ('friend', 'yourpwd');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | mypwd |
| 2 | friend | yourpwd |
+----+----------+----------+
2 rows in set (0.00 sec)

创建user2表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> create table user2 (
id bigint unsigned not null auto_increment,
username varchar(100),
password varchar(100),
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user2 (username,password) values ('student2','mypwd2'), ('friend2', 'yourpwd2');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from user2;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student2 | mypwd2 |
| 2 | friend2 | yourpwd2 |
+----+----------+----------+
2 rows in set (0.00 sec)

创建其库的表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> use linkserver;
Database changed

mysql> create table user (
id bigint unsigned not null auto_increment,
username varchar(100),
password varchar(100),
primary key (id)
)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user (username,password) values ('student','mypwd'), ('friend', 'yourpwd');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | mypwd |
| 2 | friend | yourpwd |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> quit

备份所有数据库,包括内置数据库,用得少:

1
2
# mysqldump -uroot -p123456 --all-databases sqlserver linkserver > /tmp/sql-all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

备份多个数据库:

1
2
# mysqldump -uroot -p123456 --databases sqlserver linkserver > /tmp/all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

备份sqltest数据库,备份单个数据库还原时需要自己建立数据库:

1
2
# mysqldump -uroot -p123456 sqlserver > /tmp/sqlserver.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

备份sqltest数据库的user表:

1
2
# mysqldump -uroot -p123456 sqlserver user > /tmp/sqlserver_user.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

忽略指定数据库的某个表:

1
2
# mysqldump -uroot -p123456 sqlserver --ignore-table=sqlserver.user > /tmp/ignore.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

备份数据库的表结构,不备份数据:

1
2
# mysqldump -uroot -p123456 sqlserver -d > /tmp/sqlserver_struct.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

进入数据库导入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# mysql -uroot -p123456 -A

mysql> drop database sqlserver;
Query OK, 2 rows affected (0.01 sec)

mysql> drop database linkserver;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

mysql> source /tmp/all.sql;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| linkserver |
| mysql |
| performance_schema |
| sqlserver |
| sys |
+--------------------+
6 rows in set (0.01 sec)

mysql> select * from sqlserver.user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | mypwd |
| 2 | friend | yourpwd |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from sqlserver.user2;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student2 | mypwd2 |
| 2 | friend2 | yourpwd2 |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from linkserver.user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | mypwd |
| 2 | friend | yourpwd |
+----+----------+----------+
2 rows in set (0.01 sec)

恢复单个库,需要创建数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
mysql> drop database sqlserver;
Query OK, 2 rows affected (0.03 sec)

mysql> drop database linkserver;
Query OK, 1 row affected (0.01 sec)

mysql> create database sqlserver;
Query OK, 1 row affected (0.01 sec)

mysql> use sqlserver;
Database changed

mysql> source /tmp/sqlserver.sql;

mysql> show tables;
+---------------------+
| Tables_in_sqlserver |
+---------------------+
| user |
| user2 |
+---------------------+
2 rows in set (0.00 sec)

mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student | mypwd |
| 2 | friend | yourpwd |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from user2;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | student2 | mypwd2 |
| 2 | friend2 | yourpwd2 |
+----+----------+----------+
2 rows in set (0.01 sec)

mysql> quit

mysql忘记root密码处理

mysql忘记root密码:

  • 忘记密码可以重置,需要root登录服务器。

  • mysql所有的服务器要能ssh登录。

node1

备份mysql配置文件:

1
# cp /etc/my.cnf /etc/my.cnf.bak.pwd

修改配置文件,重启数据库:

1
2
3
4
5
# vim /etc/my.cnf
# 2行,修改配置
bind-address=127.0.0.1
# 3行,添加配置
skip-grant-tables
1
2
# systemctl restart mysqld
# systemctl status mysqld

跳过登录认证,直接登录:

1
# mysql -uroot -A

查看密码,有密码:

1
2
3
4
5
6
7
8
9
10
11
mysql> select user,host,authentication_string from mysql.user;
+------------------+-----------+------------------------------------------------------------------------+
| user | host | authentication_string |
+------------------+-----------+------------------------------------------------------------------------+
| testuser | 10.80.0.1 | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
/5* U&H\/eWefOkid1SAT6JRYDKSORYc4ARQxuO8NKWQqFCuUAh/ |
+------------------+-----------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)

置空root密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> update mysql.user set authentication_string='' where user='root' and host='localhost';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select user,host,authentication_string from mysql.user;
+------------------+-----------+------------------------------------------------------------------------+
| user | host | authentication_string |
+------------------+-----------+------------------------------------------------------------------------+
| testuser | 10.80.0.1 | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| root | localhost | |
+------------------+-----------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

mysql> quit

还原配置,重启数据库:

1
2
3
# \cp /etc/my.cnf.bak.pwd /etc/my.cnf
# systemctl restart mysqld
# systemctl status mysqld

无密码登录,配置密码:

1
2
3
4
5
6
7
8
9
# mysql -uroot -A

mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit

mysql数据库重新初始化

node1

停止数据库:

1
# systemctl stop mysqld

删除数据目录:

1
# \rm -rf /data/mysql/*

初始化数据库:

1
# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql &> ~/passwd

记录密码:

1
2
# grep password ~/passwd
2023-12-06T16:48:57.914972Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: :qq3Yg;pX>rw

启动数据库:

1
2
# systemctl start mysqld
# systemctl status mysqld
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# mysql -uroot -p':qq3Yg;pX>rw' -A

mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

mysql常用运维管理命令

node1

查询mysql进程,查看客户端IP、用户、执行命令:

1
2
3
4
5
6
7
8
mysql> show processlist;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 44 | Waiting on empty queue | NULL |
| 8 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
2 rows in set (0.00 sec)

添加用户,进行授权:

1
2
3
4
5
6
7
8
mysql> create user 'testuser'@'10.80.10.1' identified with mysql_native_password by 'password';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on *.* to 'testuser'@'10.80.10.1' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

新建窗口登录:

1
2
3
4
5
6
7
8
9
10
11
# mysql -utestuser -ppassword -A -h10.80.10.1

mysql> show processlist;
+----+-----------------+------------------+------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+------------------+------+---------+------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 96 | Waiting on empty queue | NULL |
| 8 | root | localhost | NULL | Sleep | 23 | | NULL |
| 9 | testuser | 10.80.10.1:33850 | NULL | Query | 0 | starting | show processlist |
+----+-----------------+------------------+------+---------+------+------------------------+------------------+
3 rows in set (0.00 sec)

旧窗口kill用户testuser的id:

1
2
mysql> kill 9;
Query OK, 0 rows affected (0.00 sec)

新窗口testuser用户需要退出重连才能输入命令:

1
2
3
4
mysql> show databases;
ERROR 2013 (HY000): Lost connection to MySQL server during query

mysql> quit
1
2
3
4
5
6
7
8
9
10
11
12
# mysql -utestuser -ppassword -A -h10.80.10.1

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)

testuser用户窗口查看:

1
2
3
4
5
6
7
8
9
10
11
mysql> show full processlist;
+----+-----------------+------------------+------+---------+------+------------------------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+------------------+------+---------+------+------------------------+-----------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 148 | Waiting on empty queue | NULL |
| 8 | root | localhost | NULL | Query | 0 | starting | show full processlist |
| 10 | testuser | 10.80.10.1:33854 | NULL | Sleep | 4 | | NULL |
+----+-----------------+------------------+------+---------+------+------------------------+-----------------------+
3 rows in set (0.00 sec)

mysql> quit

新窗口shell直接查看登录ip:

1
2
3
4
5
6
7
8
9
10
11
12
13
# mysql -uroot -p123456 -A -e "show full processlist"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-----------------+-----------+------+---------+------+------------------------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+------+------------------------+-----------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 216 | Waiting on empty queue | NULL |
| 14 | root | localhost | NULL | Query | 0 | starting | show full processlist |
+----+-----------------+-----------+------+---------+------+------------------------+-----------------------+
# mysql -uroot -p123456 -A -e "show full processlist" | awk '{print $3}'
mysql: [Warning] Using a password on the command line interface can be insecure.
Host
localhost
localhost

查看变量配置:

1
mysql> show variables;

查看字符集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)

查看事务设置,autocommit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> show variables like '%commit%';
+-----------------------------------------+-------------------+
| Variable_name | Value |
+-----------------------------------------+-------------------+
| autocommit | ON |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_order_commits | ON |
| innodb_api_bk_commit_interval | 5 |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 2 |
| original_commit_timestamp | 36028797018963968 |
| slave_preserve_commit_order | OFF |
+-----------------------------------------+-------------------+
9 rows in set (0.00 sec)

查看密码过期时间,default_password_lifetime:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> show variables like '%password%';
+----------------------------------------------+-----------------+
| Variable_name | Value |
+----------------------------------------------+-----------------+
| caching_sha2_password_auto_generate_rsa_keys | ON |
| caching_sha2_password_private_key_path | private_key.pem |
| caching_sha2_password_public_key_path | public_key.pem |
| default_password_lifetime | 0 |
| disconnect_on_expired_password | ON |
| mysql_native_password_proxy_users | OFF |
| password_history | 0 |
| password_require_current | OFF |
| password_reuse_interval | 0 |
| report_password | |
| sha256_password_auto_generate_rsa_keys | ON |
| sha256_password_private_key_path | private_key.pem |
| sha256_password_proxy_users | OFF |
| sha256_password_public_key_path | public_key.pem |
+----------------------------------------------+-----------------+
14 rows in set (0.00 sec)

查看最大连接数,max_connections:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show variables like '%connect%';
+-----------------------------------------------+--------------------+
| Variable_name | Value |
+-----------------------------------------------+--------------------+
| character_set_connection | utf8mb4 |
| collation_connection | utf8mb4_0900_ai_ci |
| connect_timeout | 60 |
| disconnect_on_expired_password | ON |
| init_connect | |
| max_connect_errors | 100 |
| max_connections | 151 |
| max_user_connections | 0 |
| mysqlx_connect_timeout | 30 |
| mysqlx_max_connections | 100 |
| performance_schema_session_connect_attrs_size | 512 |
+-----------------------------------------------+--------------------+
11 rows in set (0.00 sec)

查看缓存大小,innodb_buffer_pool_size:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> show variables like '%buffer%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| bulk_insert_buffer_size | 8388608 |
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_in_core_file | ON |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | 134217728 |
| innodb_change_buffer_max_size | 25 |
| innodb_change_buffering | all |
| innodb_log_buffer_size | 16777216 |
| innodb_sort_buffer_size | 1048576 |
| join_buffer_size | 262144 |
| key_buffer_size | 8388608 |
| myisam_sort_buffer_size | 8388608 |
| net_buffer_length | 16384 |
| preload_buffer_size | 32768 |
| read_buffer_size | 131072 |
| read_rnd_buffer_size | 262144 |
| sort_buffer_size | 262144 |
| sql_buffer_result | OFF |
+-------------------------------------+----------------+
25 rows in set (0.00 sec)

查看超时时间,interactive_timeout:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> show variables like '%timeout%';
+-----------------------------------+----------+
| Variable_name | Value |
+-----------------------------------+----------+
| connect_timeout | 60 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| mysqlx_connect_timeout | 30 |
| mysqlx_idle_worker_thread_timeout | 60 |
| mysqlx_interactive_timeout | 28800 |
| mysqlx_port_open_timeout | 0 |
| mysqlx_read_timeout | 30 |
| mysqlx_wait_timeout | 28800 |
| mysqlx_write_timeout | 60 |
| net_read_timeout | 120 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------------+----------+
20 rows in set (0.00 sec)

更改mysql配置,设置当前会话,其它窗口不会改变:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set autocommit=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)

设置全局,添加最大连接数,重启数据库失效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.01 sec)

mysql> set global max_connections=1024;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1024 |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> quit
Bye

写入配置文件,永久生效:

1
2
3
# vim /etc/my.cnf
# 3行,添加配置
max_connections=1024
1
2
# systemctl restart mysqld
# systemctl status mysqld
1
2
3
4
5
6
7
8
9
# mysql -uroot -p123456 -A

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1024 |
+-----------------+-------+
1 row in set (0.01 sec)

设置全局,慢日志时间:

1
2
3
4
5
6
7
8
9
10
mysql> show variables like '%query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.00 sec)

mysql> set global long_query_time = 0.2;
Query OK, 0 rows affected (0.00 sec)

mysql状态:

1
mysql> show global status;

mysql启动时间:

1
2
3
4
5
6
7
8
mysql> show global status like '%uptime%';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| Uptime | 19 |
| Uptime_since_flush_status | 19 |
+---------------------------+-------+
2 rows in set (0.00 sec)

mysql流量信息:

1
2
3
4
5
6
7
8
9
10
11
12
mysql>  show global status like '%bytes%';
+--------------------------------+----------+
| Variable_name | Value |
+--------------------------------+----------+
| Bytes_received | 786 |
| Bytes_sent | 14969 |
| Innodb_buffer_pool_bytes_data | 15335424 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Mysqlx_bytes_received | 0 |
| Mysqlx_bytes_sent | 0 |
+--------------------------------+----------+
6 rows in set (0.00 sec)

mysql连接信息,Threads_connected:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> show global status like '%connect%';
+-------------------------------------------------------+---------------------+
| Variable_name | Value |
+-------------------------------------------------------+---------------------+
| Aborted_connects | 0 |
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 0 |
| Connection_errors_peer_address | 0 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 15 |
| Locked_connects | 0 |
| Max_used_connections | 2 |
| Max_used_connections_time | 2023-12-07 00:50:44 |
| Mysqlx_connection_accept_errors | 0 |
| Mysqlx_connection_errors | 0 |
| Mysqlx_connections_accepted | 0 |
| Mysqlx_connections_closed | 0 |
| Mysqlx_connections_rejected | 0 |
| Performance_schema_session_connect_attrs_longest_seen | 125 |
| Performance_schema_session_connect_attrs_lost | 0 |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_finished_connects | 0 |
| Threads_connected | 1 |
+-------------------------------------------------------+---------------------+
22 rows in set (0.00 sec)

统计命令运行次数:

1
2
3
4
5
6
7
8
9
10
mysql> show global status like '%con_insert%';
Empty set (0.00 sec)

mysql> show global status like '%con_update%';
Empty set (0.00 sec)

mysql> show global status like '%con_select%';
Empty set (0.01 sec)

mysql> quit