管理数据库

全部命令,详见此文: [数据库]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;'
数据库之数据库管理篇[mysql]

查看数据库连接的所有进程

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';
数据库之数据库管理篇[mysql]

[方式2]

shell> ps -ef|grep mysql
shell> cat /home/sdc/public/app/mysql/conf/my.cnf | grep -i port
port=53302
数据库之数据库管理篇[mysql]

[方式3]

mysql> netstat -antp | grep -i mysql
数据库之数据库管理篇[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]

退出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
数据库之数据库管理篇[mysql]

卸载

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
数据库之数据库管理篇[mysql]

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
数据库之数据库管理篇[mysql]
  • 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中;所以,在做完权限更改后需重新加载
数据库之数据库管理篇[mysql]数据库之数据库管理篇[mysql]数据库之数据库管理篇[mysql]

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';
数据库之数据库管理篇[mysql]

查看数据库所有表及表注释

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;
数据库之数据库管理篇[mysql]

添加表的列

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 推荐文献

相关文章:

  • 2021-12-08
  • 2021-09-27
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
猜你喜欢
  • 2021-05-17
  • 2021-11-18
  • 2021-07-04
  • 2021-11-13
  • 2021-07-13
  • 2021-12-19
相关资源
相似解决方案