管理数据库
全部命令,详见此文: [数据库]mysql命令帮助说明 - 博客园/千千寰宇
-h, --host=name Connect to host.
-P, --port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-ixn default (3306).
-u, --user=name User for login if not current user.
-p, --password[=name]
Password to use when connecting to server. If password is
not given it's asked from the tty.
-v, --verbose Write more. (-v -v -v gives the table output format).
-V, --version Output version information and exit.
-e, --execute=name Execute command and quit. (Disables --force and history
file.)
-U, --safe-updates Only allow UPDATE and DELETE that uses keys.
-U, --i-am-a-dummy Synonym for option --safe-updates, -U.
1 mysql连接/开闭/版本篇
连接
mariadb在Linux中首次进入mysql(因为此时还没有创建任何用户,mysql的root并不等效于linux中的root用户)
sudo mysql
进入/连接mysql(创建数据库用户后)
[本地登录]
mysql -u userName -p
[远程登录]
mysql -u<userName> [-h<hostName>] -p<password>
[补充: 指定端口等连接信息]
--[case1]--
mysql -h127.0.0.1 --port=3306 -uroot -p
--[case2]--
mysql -uroot -pMyPassword --port=3306 -h127.0.0.1 -e 'show databases;'
查看数据库连接的所有进程
SHOW FULL PROCESSLIST
批量杀掉连接进程
[方式1](亲测有效)通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令
mysql> select concat('KILL ',id,';') from information_schema.processlist where user='root';
+------------------------+
| concat('KILL ',id,';') |
+------------------------+
| KILL 3101; |
| KILL 2946; |
+------------------------+
2 rows in set (0.00 sec)
mysql>select concat('KILL ',id,';') from information_schema.processlist where user='root' into outfile '/tmp/a.txt';
Query OK, 2 rows affected (0.00 sec)
mysql>source /tmp/a.txt;
Query OK, 0 rows affected (0.00 sec)
[方式2]
mysqladmin -uroot -p processlist|awk -F "|" '{print $2}'|xargs -n 1 mysqladmin -uroot -p kill
mysqladmin -uroot -p processlist|awk -F "|" '{if($3 == "Mike")print $2}'|xargs -n 1 mysqladmin -uroot -p kill
[方式3] 通过SHEL脚本实现
#杀掉锁定的MySQL连接
for id in `mysqladmin processlist|grep -i locked|awk '{print $1}'`
do
mysqladmin kill ${id}
done
[方式4] 通过Maatkit工具集中提供的mk-kill命令进行
#杀掉超过60秒的sql
mk-kill -busy-time 60 -kill
#如果你想先不杀,先看看有哪些sql运行超过60秒
mk-kill -busy-time 60 -print
#如果你想杀掉,同时输出杀掉了哪些进程
mk-kill -busy-time 60 -print –kill
查看mysql的最大连接数
show variables like '%max_connections%';
查看服务器响应的最大连接数
show global status like 'Max_used_connections';
查看数据库开放的端口
[方式1]
shell> mysql -uroot -pPasswd
mysql> show global variables like 'port';
[方式2]
shell> ps -ef|grep mysql
shell> cat /home/sdc/public/app/mysql/conf/my.cnf | grep -i port
port=53302
[方式3]
mysql> netstat -antp | grep -i mysql
运行/开闭
查看mysql是否已经在运行
## Linux 系统
ps -ef | grep mysqld
启动mysql
## Windows 系统
#### 方式1
step1: 我的电脑(右键)>管理>服务和应用程序>服务
或者 Win键+R键>"services.msc"
step2: "MYSQL">"启动"
#### 方式2
CMD> tasklist | findstr mysql
CMD> net start mysql # start 开启 stop 停止
退出mysql
EXIT;
版本
查看mysql数据库版本
【方法1】需要进入mysql
mysql> select version();
【方法2】Shell命令窗口下/不需要进入mysql
cmd> mysql --version 等效于 mysql -V
【方法3】需要进入mysql(查看数据库完整配置)
mysql> status;
【方法4】需要进入mysql
mysql --help |grep Distrib
卸载
OS: CENTOS6/7
- 卸载/安装前检查 MySQL的安装情况
rpm -qa | grep -i mysql
rpm -qa | grep -i mariadb
rpm -qa | grep -i Percona
- 卸载
rpm -e --nodeps xxxx(rpm包名)
例如:
rpm -e --nodeps Percona-Server-shared-compat-57-5.7.24-27.1.el7.x86_64
rpm -e --nodeps Percona-Server-shared-57-5.7.24-27.1.el7.x86_64
rpm -e --nodeps Percona-Server-server-57-5.7.24-27.1.el7.x86_64
rpm -e --nodeps Percona-Server-client-57-5.7.24-27.1.el7.x86_64
2 用户管理篇(含权限)
注意:任何涉及【用户管理与授权】的操作中↓↓↓
- username@hostName/ip中的【hostName/ip】必须与【mysql.user表中的host字段一致,一旦不一致,任何关于【用户授权】的操作都将可能产生错误!】
- 查看mysql.user表各字段信息: USE mysql; SELECT host,user FROM user;
- 新版本 MySQL 8.0将【创建用户】和【授权】分开了
- 若【创建用户】与【授权】在同一语句执行(Eg: grant all privileges on test.* to root@'%' identified '123456'????,则
- 报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT
- 若【创建用户】与【授权】在同一语句执行(Eg: grant all privileges on test.* to root@'%' identified '123456'????,则
- MySQL8.0起 - 用户授权方法(先创建用户,再授权)
- USE mysql; ## 使用mysql数据库
- UPDATE user SET host='%' WHERE user='userName'; # 修改指定用户的host范围
- FLUSH PRIVILEGES; # 刷新权限表
- GRANT ALL PRIVILEGES ON dataBaseName.* to userName@host; # 授权
- FLUSH PRIVILEGES; # 刷新权限表
查看用户表
mysql> USE mysql;
mysql> SELECT host,authentication_string,user FROM user; # 命令1
mysql> SELECT host,user FROM mysql.user; # 命令2
更改某用户密码
# 方式1
ALTER USER userName@host IDENTIFIED BY 'newPassword'; # 尤其是: mysql 8.0之后的版本 初次修改root密码【亲测有效,MySQL8.0中发生重大改版】
FLUSH PRIVILEGES;
# 方式2
USE mysql;
SET password FOR userName@host = password('newPassword');
FLUSH PRIVILEGES;
# SHOW GRANTS FOR 'johnny'@'%'; # 查看数据库中具体某个用户的权限
删除数据库用户
USE mysql;
DELETE FROM user WHERE user='jack' AND host='%';
FLUSH PRIVILEGES;
添加数据库用户
USE mysql; # 进入mysql系统数据库
# 方式A
CREATE user userName@'localhost'; # 方式1
-- CREATE user userName@'%'; # 方式2 %: 任意主机
SET PASSWORD FOR userName@'localhost'=PASSWORD('my-password');
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON db001.* TO userName@'%' IDENTIFIED BY 'my-password'; -- 给用户 userName 授予数据库(db001)的 SELECT,INSERT,UPDATE,DELETE,CREATE,DROP 权限
CREATE user userName@'%' IDENTIFIED BY 'password'; # 方式3
ALTER USER userName@'%' IDENTIFIED BY 'password'; # 方式4
# 方式B
INSERT INTO user(
host, user, password,
select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest',
PASSWORD('guest123'), 'Y', 'Y', 'Y');
# 密码:guest123 授权:SELECT,INSERT 和 UPDATE
# 所有权限:Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,...
FLUSH PRIVILEGES;# 更新mysql数据库系统的用户权限列表
# 数据库用户授权方式2:
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON databaseName.* TO 'userName'@'%' IDENTIFIED BY 'passwordValue'; # %:任何【主机(ip)】都可访问到
# 数据库用户授权方式3:
GRANT ALL PRIVILEGES ON databaseName.* TO userName; # 第1个*:其内指定数据库的【所有表】
GRANT ALL PRIVILEGES ON databaseName.* TO userName@'%';
# 回收权限
REVOKE DROP,UPDATE ON databaseName.* from userName;
查看系统所有权限
SHOW PRIVILEGES;# 授权见用户篇
查看当前登录用户
SELECT user();
# 'johnny@localhost'
查看当前用户详细信息(权限等)
DESC USER;
查看数据库系统所有用户详细信息
SELECT * FROM USER;
SELECT User,Host,plugin,authentication_string,password_expired,password_last_changed FROM USER;
更改根用户密码
# 方式1
SET PASSWORD = PASSWORD('123456');
FLUSH PRIVILEGES;# 更新mysql数据库系统的用户权限列表
# 方式2
UPDATE mysql.user SET PASSWORD=PASSWORD('123456') WHERE user='root' and host='localhost';
FLUSH PRIVILEGES;# 更新mysql数据库系统的用户权限列表
给指定用户开放远程可访问指定数据库实例的权限
- CASE1 给root用户开放远程访问权限
use mysql;
SELECT host,user FROM user;
# 确认root用户是否真的没有开放远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
flush privileges;
# 因为MySQL把权限都放在了cache中;所以,在做完权限更改后需重新加载
3 数据库篇
创建数据库
DROP DATABASE ID EXISTS databaseName;
CREATE DATABASE databaseName;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `ga_jrsjy` /*!40100 DEFAULT CHARACTER SET utf8 */;
/*!32312、/*!40100是指: 注解里!后紧跟版本号表示只有当前mysql版本高于这个版本号(3.23.12、4.01.00)时,才执行注解里的命令IF NOT EXISTS:只有在该数据库(Eg:ga_jrsjy)不存在时,才创建该库。即 若该库已经存在,则:不会再重新创建
使用(切换)指定数据库
USE databaseName;
删除指定数据库
# 假设已经登录数据库时
DROP DATABASE databaseName;
# 假设未登录数据库时
mysqladmin -u root -p DROP databaseName;
修改数据库的字符集
ALTER DATABASE tableName character SET utf8;#注意:字符集不能加字符'-'
查询所有数据库名
SHOW DATABASES; # 列出数据库中所有的数据库名
查看当前数据库
SELECT database();
4 表与索引管理篇
创建表
DROP TABLE IF EXISTS `S_APPLY_SERVICES_ORDER`;
CREATE TABLE `tb_student` (
id INT NOT NULL PRIMARY KEY COMMENT '学号',
name VARCHAR(50) COLLATE utf8mb4 NOT NULL COMMENT '姓名',
sex VARCHAR(2) DEFAULT'男' CHECK(sex IN ('男', '女')) COMMENT '性别',
birthdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '出生年月',
grade INT COMMENT '年级'
-- PRIMARY KEY (`FLOW_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4 COMMENT='学生信息表';
查看数据库的所有表
SELECT
TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE,
VERSION, ROW_FORMAT, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH,
DATA_FREE, AUTO_INCREMENT, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, CHECKSUM
FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'Etl_Source_jz';
查看数据库所有表及表注释
SELECT
TABLE_NAME,
TABLE_COMMENT
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA = 'Etl_Source_jz';
显示指定数据库的所有表名
USE databaseName;
SHOW TABLES
显示表的结构信息
SHOW COLUMNS FROM tableName;
DESC tableName; #第二种方式
显示数据表的详细索引(含主键)
SHOW INDEX FROM;
查询当前数据库所有表的详细信息
SHOW TABLE STATUS FROM tableName; # 查询当前数据库所有表的详细信息
SHOW TABLE STATUS LIKE 'xxx%'; # 表名以xxx开头的表的信息
SHOW TABLE STATUS FROM tableName LIKE 'xxxx%'\G; # 加上 \G,查询结果按列打印
查看当前数据库中所有表的行数
use information_schema;
select table_name,table_rows from tables where TABLE_SCHEMA = '<数据库名称>' order by table_rows desc;
添加表的列
ALTER TABLE table_name ADD COLUMN columnB VARCHAR(10);
删除表的某列
ALTER TABLE table_name DROP COLUMN field_name;
修改表的表名
ALTER TABLE table_nameA RENAME table_nameB;
修改表的列名
ALTER TABLE table_name CHANGE COLUMN columnA columnB VARCHAR(30) COMMENT 'commentValue';
修改表的列
ALTER TABLE table_name MODIFY columnA CHAR(10) -- 修改 表列类型
ALTER TABLE table-name ADD
PRIMARY KEY ( table-id ); -- 添加 主键
ALTER TABLE table-name ADD -- 添加 外键
CONSTRAINT foreign-key-name
FOREIGN KEY(curent-table-column-name) REFERENCES pk-table-name(pk-table-column-name)
ALTER TABLE table-name DROP PRIMARY KEY; -- 删除 主键
ALTER TABLE table-name DROP FOREIGN KEY foreign-key-name; -- 删除 外键
修改某列的值为X或者为空
UPDATE table_name SET field_name = 'X';
UPDATE table_name SET field_name = '';
强制禁用所有表的外键约束
用于删除表时使用
- GLOBAL FOREIGN_KEY_CHECKS 基于全局
- FOREIGN_KEY_CHECKS 基于临时的Session
SET FOREIGN_KEY_CHECKS = 0; # 0:禁用外键约束 1:启用外键约束 (FOREIGN_KEY_CHECKS基于session,当关闭session重新建立连接,本变量会自动恢复默认值)
5 数据库SQL常用語句
刪除
DELETE FROM table_name [WHERE Clause]
查看
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
修改
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
注: 易错 一条UPDATE的SQL同时修改多个字段值,字段与字段之间使用逗号,,而非and!
否则,MySQL数据库会报此类异常:Data truncation: Truncated incorrect DOUBLE value:??
推荐本文: [数据库/MySQL]解决异常:Data truncation: Truncated incorrect DOUBLE value: 'dc5' - 千千寰宇
新增/插入
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES ( value1, value2,...valueN );
INSERT INTO target_db.target_table( field1, field2, ... )
SELECT value1,value2, ... FROM oringin_db.origin_table
注释
- 单行注释: # --
# SELECT * FROM test.department;
-- SELECT * FROM test.department;
- 多行注释: /* sql content */
/*
SELECT * FROM test.department;
*/
6 推荐文献
- Linux查看MySQL版本的四种方法
- mysql操作查询结果case when then else end用法举例
- MySQL 数据类型
- [数据库]mysql命令帮助说明 - 博客园/千千寰宇
- [数据库]MySQL之SQL查询 - 博客园/千千寰宇
- 批量杀死MySQL连接的四种方法详解 - 脚本之家
- MySQL中的CHARSET和COLLATE关键字 - CSDN