MySQL常用命令基础操作
Posted 浪漫De刺猬❥(^_-)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL常用命令基础操作相关的知识,希望对你有一定的参考价值。
mysql启动与更改密码
mysql启动基本原理说明:
/etc/init.d/mysqld是一个shell启动脚本,启动后最终会调用,mysqld_safe脚本,最后调用mysqld服务启动mysql,我们编辑/etc/init.d/mysqld,可以看到脚本,启动俩个进程mysqld和mysqld_safe,一般故障的时候我们用mysqld_safe来启动,
关闭mysql
1 mysqladmin - uroot -p密码 shut down
2 /etc/init.d/mysqld stop
3 kill USR2`cat path/pid`
优雅的关闭mysql但是不建议用killall杀掉所有的mysql进程,这样会导致mysql数据库起不来,所以网友遇到这样情况也很多,
我们登陆mysql后想分清出那个是正式环境那个是测试环境,
命令行修改登陆提示符
mysql> prompt[email protected]s-> PROMPT set to ‘[email protected]s->‘
配置文件修改登陆提示符
在my.cnf配置文件中[mysql]模块下添加如下内容,保存后,无需重启myysql,退出当前的session,重新登陆
[mysql] prompt=\[email protected]s->
登陆mysql
[root @king~]# mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 2 Server version: 5.5.40 MySQL Community Server (GPL) Copyright (c) 2000, 2014, 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>
更改root密码
1 mysql> update user set password=password(‘123456‘) where user=‘root‘ and host=‘localhost‘; #password(‘12345‘)是指定一个函数 2 Query OK, 1 row affected (0.00 sec) 3 Rows matched: 1 Changed: 1 Warnings: 0 4 mysql> flush privileges; #刷新,没刷新前是在内存里面 5 Query OK, 0 rows affected (0.17 sec) 6 mysql>
说明,修改密码都需要刷新一下哦,linux找回mysql root用户密码
单实例mysql修改丢失root方法
1,首先停止mysql
/etc/init.d/mysql stop
2,使用--skip-grant-tables启动mysql,忽略授权登陆验证
1 mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
2 mysql -u root -p #说明-p登陆时密码是空,也可以不加-p,亲测哦(#^.^#)
3 update mysql.user set password=password("newpassword") where user=‘root‘and host=‘localhost‘;
4 mysql> flush privileges;
5 mysql> quit
6 # /etc/init.d/mysql restart
7 # mysql -uroot -p
8 enter password: <输入新设的密码newpassword>
9 mysql>
多实例mysql修改丢失root方法
1关闭mysql
killall mysqld
2启动时加--skip-grant-tables参数
mysql_safe --defaults-file=/data/3306/my.cnf --skip-grant-tables& mysql -u root -p -S /data/3306/mysql.sock
3修改密码
mysql>update mysql.user set password=password("newpassword") where user=‘root‘and host=‘localhost‘; mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
SQl的分类
SQl结构化查询语言包含6个部分
- 数据查询语言(DQL(data query language)),作用从表中获取数据,关键字select,
- 数据操作语言(DMl(data manipulation language))作用处理表中的数据insert ,update,delete
- 事务处理语言(TPL)关键字begin,commit和 rollback
- 数据控制语言(DCl)grant(授权) 和revoke
- 数据定义语言(DDl)create和drop在数据库中创建新表或删除表 alter
- 指针控制语言(CCl) declare cursor, fetch into 和update where current用于对一个或多个表单独行的操作
查看数据库
show databases;或show database link ‘‘;或select database;
1 mysql> show databases;
2 +--------------------+
3 | Database |
4 +--------------------+
5 | information_schema |
6 | mysql |
7 | performance_schema |
8 | student |
9 | test |
10 +--------------------+
11 8 rows in set (0.01 sec)
创建数据库
命令语法:create database <数据库名> 注意库名字不能数字开头
1 mysql> create database king; 2 Query OK, 1 row affected (0.01 sec) 3 4 mysql> show databases; 5 +--------------------+ 6 | Database | 7 +--------------------+ 8 | information_schema | 9 | king | 10 | mysql | 11 | performance_schema | 12 | student | 13 | test | 14 +--------------------+ 15 6 rows in set (0.01 sec) 16 17 mysql> show create database kingG 18 *************************** 1. row *************************** 19 Database: king 20 Create Database: CREATE DATABASE `king` /*!40100 DEFAULT CHARACTER SET utf8 */ 21 1 row in set (0.00 sec) 22 23 mysql>
创建一个指定字符集的数据库
1 mysql> CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; #红色指定编码,蓝色校验规则。 2 Query OK, 1 row affected (0.01 sec)
删除数据库
drop database <数据库名字>
1 mysql> drop database test; 2 Query OK, 1 row affected (0.07 sec) 3 4 mysql> show databases; 5 +--------------------+ 6 | Database | 7 +--------------------+ 8 | information_schema | 9 | king | 10 | mysql | 11 | performance_schema | 12 | student | 13 +--------------------+ 14 5 rows in set (0.01 sec)
连接数据库
命令:use <数据库名>相当于linux下的cd切换目录的命令,use是切换数据库
1 mysql> use king; 2 Database changed 3 mysql> select database(); #查看当前的数据库,带()相当于函数, 4 +------------+ 5 | database() | 6 +------------+ 7 | king | 8 +------------+ 9 1 row in set (0.00 sec)
查看数据库
select database ();相当于linux下的pwd
1 mysql> select version(); #查看当前的版本 2 +-----------+ 3 | version() | 4 +-----------+ 5 | 5.5.40 | 6 +-----------+ 7 1 row in set (0.06 sec) 8 mysql> select user(); #查看当前的用户 9 +----------------+ 10 | user() | 11 +----------------+ 12 | [email protected] | 13 +----------------+ 14 1 row in set (0.04 sec) 15 mysql> select now(); #查看当前的时间 16 +---------------------+ 17 | now() | 18 +---------------------+ 19 | 2018-11-02 19:26:39 | 20 +---------------------+ 21 1 row in set (0.02 sec) 22 mysql>
表操作
创建表并查看
create table <表名>(<字段名1><类型1>);
1 mysql> create table im(id int(3) not null, name varchar(20) not null default‘QQ‘ #创建表id为int类型,name为varchar 2 ); 3 Query OK, 0 rows affected (0.59 sec) 4 mysql> show tables from king; #从king数据库中查看表 5 +----------------+ 6 | Tables_in_king | 7 +----------------+ 8 | im | 9 +----------------+ 10 1 row in set (0.04 sec) 11 mysql> desc im; #查看表结构 12 +-------+-------------+------+-----+---------+-------+ 13 | Field | Type | Null | Key | Default | Extra | 14 +-------+-------------+------+-----+---------+-------+ 15 | id | int(3) | NO | | NULL | | 16 | name | varchar(20) | NO | | QQ | | 17 +-------+-------------+------+-----+---------+-------+ 18 2 rows in set (0.22 sec) 19 mysql>
show colums from im;查看表结构
1 mysql> show create table im G; #G Send command to mysql server,display result vertically向MySQL服务器发送命令,垂直显示结果 2 *************************** 1. row *************************** 3 Table: im 4 Create Table: CREATE TABLE `im` ( 5 `id` int(3) NOT NULL, 6 `name` varchar(20) NOT NULL DEFAULT ‘QQ‘ 7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 8 1 row in set (0.64 sec)
mysql表的字段类型
列类型 | 需要的存储量 |
tinyint | 1字节 |
smallint | 2个字节 |
mediumint | 3个字节 |
int | 4个字节 |
integer | 4个字节 |
bigint | 8个字节 |
float(X) | 4如果x<=24或8如果25<=X=53 |
float | 4个字节 |
double | 8个字节 |
double precision | 8个字节 |
real | 8个字节 |
decimal(M,D) | M字节(D+2,如果m<D) |
numeric(M,D) | M字节(D+2,如果m<D) |
为表的字段创建索引
创建主键索引,查询数据库,按主键查询是最快的,每一个表只有一个主键列,但是可以有多个普通的索引列,主键列要求列的内容必须唯一,而索引列不要求内容必须唯一。
create table student(
id int (4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default‘0‘,
dept varchar(16) default null,
primary key (id),
key index_name(name));
1 mysql> create table student( id int (4) not null auto_increment, name char(20) n 2 ot null, age tinyint(2) not null default‘0‘,dept varchar(16) default null,primar 3 y key (id), key index_name(name)); 4 Query OK, 0 rows affected (0.18 sec)
auto_increment自增,primary key (id), 主键,key index_name(name));普通索引,
1 mysql> desc student; #查看创建的student表 2 +-------+-------------+------+-----+---------+----------------+ 3 | Field | Type | Null | Key | Default | Extra | 4 +-------+-------------+------+-----+---------+----------------+ 5 | id | int(4) | NO | PRI | NULL | auto_increment | 6 | name | char(20) | NO | MUL | NULL | | 7 | age | tinyint(2) | NO | | 0 | | 8 | dept | varchar(16) | YES | | NULL | | 9 +-------+-------------+------+-----+---------+----------------+ 10 4 rows in set (0.17 sec)
alter table student drop primary key ; 删除主键,测试不行,
1 mysql> alter table student drop primary key ; 2 ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
不正确的表定义;只能有一个自动COLUM它必须被定义为一个密钥
alter table student change id id int primary key auto_increment; 如果创建表忘记添加主键了,就执行这个。
创建普通索引分为唯一索引和普通索引
alter table student drop index index_name; # index固定索引,index_name是你创建表的时候的索引
alter table student add index index_name(name);
create index index_name on student (name(8)); # index固定索引(固定写法),index_name 随便写但要见名知意, on student 在哪个表上(student)8就是前8个字符创建索引。
create index index_name_dept on student (name,dept)
按条件列查询数据时,联合索引是有前缀生效特性的 index(a,b,c)仅a,ab,abc三个查询条件列可以走索引
查看表的索引
1 mysql> show index from studentG; 2 *************************** 1. row *************************** 3 Table: student 4 Non_unique: 0 5 Key_name: PRIMARY 6 Seq_in_index: 1 7 Column_name: id 8 Collation: A 9 Cardinality: 0 10 Sub_part: NULL 11 Packed: NULL 12 Null: 13 Index_type: BTREE 14 Comment: 15 Index_comment: 16 *************************** 2. row *************************** 17 Table: student 18 Non_unique: 1 19 Key_name: index_name 20 Seq_in_index: 1 21 Column_name: name 22 Collation: A 23 Cardinality: 0 24 Sub_part: NULL 25 Packed: NULL 26 Null: 27 Index_type: BTREE 28 Comment: 29 Index_comment: 30 2 rows in set (0.00 sec)
创建唯一索引
create unique index uni on student(name);
1 mysql> create unique index uni on student (name); 2 Query OK, 0 rows affected (0.09 sec) 3 Records: 0 Duplicates: 0 Warnings: 0 4 mysql> desc student; 5 +-------+-------------+------+-----+---------+----------------+ 6 | Field | Type | Null | Key | Default | Extra | 7 +-------+-------------+------+-----+---------+----------------+ 8 | id | int(4) | NO | PRI | NULL | auto_increment | 9 | name | char(20) | NO | UNI | NULL | | 10 | age | tinyint(2) | NO | | 0 | | 11 | dept | varchar(16) | YES | | NULL | | 12 +-------+-------------+------+-----+---------+----------------+ 13 4 rows in set (0.02 sec)
- 要在表的列上创建索引
- 索引会加快查询的速度,但是会影响更新的速度
- 索引不是越多越好,要在频繁查询的where后的条件列上创建索引
- 小表或唯一值极少的列上不建索引,要在带包以及不同内容多的列上创建索引
往表中插入数据
create table test(
id int(4) not null auto_increment,
name char(20) not null,
primary key (id)
);
1 mysql> create table test(id int(4) not null auto_increment, name char(20) not n 2 ll,primary key (id)); 3 Query OK, 0 rows affected (0.01 sec) 4 mysql> show tables; 5 +----------------+ 6 | Tables_in_king | 7 +----------------+ 8 | student | 9 | test | 10 +----------------+ 11 2 rows in set (0.00 sec) 12 mysql> insert into test (id,name) values(1,‘boy‘); #插入数据,主键自增我们直接插name,insert into test(name) values(‘new‘); 13 Query OK, 1 row affected (0.05 sec) 14 mysql> select *from test; 15 +----+------+ 16 | id | name | 17 +----+------+ 18 | 1 | boy | 19 +----+------+ 20 1 row in set (0.04 sec)
mysql> delete from test; Query OK, 1 row affected (0.05 sec) mysql> select *from test; Empty set (0.00 sec) mysql> insert into test (id,name) values(1,‘boy‘),(2,‘new‘); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
Loading....
创建/查看/删除mysql系统的用户
语法:
- create user ‘用户名‘@‘主机名‘ identified by ‘用户名‘; 创建用户
- select host,user from mysql.user; 查看用户
- drop user 用户名@‘%‘;注意可以是单或者双引号,但不能不加,删除用户
- delete from mysql.user where user=‘用户名‘ and host=‘@后面指定的主机名’;
1 mysql> create user ‘usrabc‘@‘%‘ identified by ‘usrabc‘; #创建usrabc用户 2 Query OK, 0 rows affected (0.49 sec) 3 mysql> select host,user from mysql.user; #查看所有用户 4 +-----------+--------+ 5 | host | user | 6 +-----------+--------+ 7 | % | usrabc | 8 | localhost | root | 9 +-----------+--------+ 10 2 rows in set (0.00 sec) 11 mysql> drop user [email protected]‘%‘; #删除usrabc用户 12 Query OK, 0 rows affected (0.00 sec)
处理完用户最好刷新一下权限,flush privileges;
创建mysql用户及赋予用户权限
通过help grant 查看帮助,比较常用的创建用户的方法是:CREATE USER ‘jeffrey‘@‘localhost‘ IDENTIFIED BY ‘mypass‘
CREATE USER ‘jeffrey‘@‘localhost‘ IDENTIFIED BY ‘mypass‘ GRANT ALL ON db1.* TO ‘jeffrey‘@‘localhost‘ #这俩命令是先用create创建用户,然后在授权 GRANT SELECT ON db2.invoice TO ‘jeffrey‘@‘localhost‘ GRANT USAGE ON *.* TO ‘jeffrey‘@‘localhost‘ WITH MAX_QUERIES_PER_HOUR 90
通过grant命令创建用户并授权,命令语法:grant all privileges on dbname.* to [email protected] identified by ‘passwd‘;
grant | all privileges | on dbname.* | to [email protected] | identified by ‘passwd‘ |
授权命令 | 对应权限 | 目标:库和表 | 用户名和客户端主机 | 用户密码 |
1 mysql> grant all privileges on king.* to [email protected] identified by ‘123456‘; 2 #创建liang用户,对king库具备所有权限,允许从localhost主机登陆管理数据库,密码是123456. 3 Query OK, 0 rows affected (0.01 sec) 4 mysql> flush privileges; 5 Query OK, 0 rows affected (0.96 sec)
1 mysql> show grants for [email protected]; #查看权限 2 +------------------------------------------------------------------------------- 3 -------------------------------+ 4 | Grants for [email protected] 5 | 6 +------------------------------------------------------------------------------- 7 -------------------------------+ 8 | GRANT USAGE ON *.* TO ‘liang‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74 9 329105EE4568DDA7DC67ED2CA2AD9‘ | 10 | GRANT ALL PRIVILEGES ON `king`.* TO ‘liang‘@‘localhost‘ 11 | 12 +------------------------------------------------------------------------------- 13 -------------------------------+ 14 2 rows in set (0.07 sec)
create和grant配合
1 mysql> create user [email protected] identified by ‘123456‘; 2 Query OK, 0 rows affected (0.04 sec) 3 mysql> grant all on king.* to [email protected]; 4 Query OK, 0 rows affected (0.00 sec) 5 mysql> flush privileges; 6 Query OK, 0 rows affected (0.00 sec)
授权局域网内主机远程连接数据库grant all privileges on king.* to [email protected]% identified by ‘123456‘;把localhost改为ip就可以了。连接,mysql -uliang -p123456 -h10.0.0.%
1 mysql> show grants for [email protected]; #查看zh用户权限 2 +------------------------------------------------------------------------------- 3 ----------------------------+ 4 | Grants for [email protected] 5 | 6 +------------------------------------------------------------------------------- 7 ----------------------------+ 8 | GRANT USAGE ON *.* TO ‘zh‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329 9 105EE4568DDA7DC67ED2CA2AD9‘ | 10 | GRANT ALL PRIVILEGES ON `king`.* TO ‘zh‘@‘localhost‘ 11 | 12 +------------------------------------------------------------------------------- 13 ----------------------------+ 14 2 rows in set (0.16 sec) 15 16 mysql> revoke insert on king.* from [email protected]; #更改权限 17 Query OK, 0 rows affected (0.04 sec) 18 19 mysql> show grants for [email protected]; 20 +------------------------------------------------------------------------------- 21 -------------------------------------------------------------------------------- 22 -------------------------------------------------------------+ 23 | Grants for [email protected] 24 25 | 26 +------------------------------------------------------------------------------- 27 -------------------------------------------------------------------------------- 28 -------------------------------------------------------------+ 29 | GRANT USAGE ON *.* TO ‘zh‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329 30 105EE4568DDA7DC67ED2CA2AD9‘ 31 | 32 | GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE T 33 EMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, A 34 LTER ROUTINE, EVENT, TRIGGER ON `king`.* TO ‘zh‘@‘localhost‘ | 35 +------------------------------------------------------------------------------- 36 -------------------------------------------------------------------------------- 37 -------------------------------------------------------------+ 38 2 rows in set (0.06 sec)
1 mysql -uroot -p123456 -e "show grants for [email protected];"|grep -i grant #用linux中grep命令过滤需要的权限 2 Grants for [email protected] 3 GRANT USAGE ON *.* TO ‘zh‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329 4 105EE4568DDA7DC67ED2CA2AD9‘ 5 GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE T 6 EMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, A 7 LTER ROUTINE, EVENT, TRIGGER ON `king`.* TO ‘zh‘@‘localhost‘
查看mysql的ALL PRIVILEGES权限mysql -uroot -p123456 -e "show grants for [email protected];"|grep -i grant|tail -1|tr ‘,’ ‘ ’ >a.txt
我们在授权用户最小的 满足业务需求的权限,而不是一味的授权ALl PRIVILEGES。
以上是关于MySQL常用命令基础操作的主要内容,如果未能解决你的问题,请参考以下文章