$ mysql -u用户名 -p密码 连接到远程主机上的MYSQL: $ mysql -h远程主机ip -u用户名 -p 推出mysql: mysql> exit (回车)
如果连接的是另一台机器,加参数 -h机器ip
查看版本:1.登录时查看。
2.系统函数
mysql> select version();
3.status命令
mysql> status
增加新用户mysql->create user 'user1'@'localhost' identified by 'password1';
user1用户名 localhost本地登录,换成指定ip,或者%任何ip都可以登录 password1密码
授权grant privileges on databasename.tablename to 'username'@'host' IDENTIFIED BY 'PASSWORD';
1.GRANT命令说明:
priveleges(权限列表),可以是all priveleges, 表示所有权限,也可以是select、update等权限,多个权限的名词,相互之间用逗号分开。
on用来指定权限针对哪些库和表。. 中前面的号用来指定数据库名,后面的号用来指定表名。
to 表示将权限赋予某个用户, 如 jack@‘localhost’ 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是 在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
identified by指定用户的登录密码,该项可以省略。
WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录–其它什么也不允许做。
2.授权原则说明:
权限控制主要是出于安全因素,因此需要遵循一下几个经验原则:
a、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。
b、创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。
c、初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。
d、为每个用户设置满足密码复杂度的密码。
e、定期清理不需要的用户。回收权限或者删除用户。
eg:
grant all privileges on `test`.* to 'test'@'%' ; grant all privileges on `test`.* to 'test'@'localhost'; grant select on test.* to 'user1'@'localhost'; grant insert on test.* to 'user1'@'localhost'; grant delete on test.* to 'user1'@'localhost'; grant update on test.* to 'user1'@'localhost'; flush privileges;
(IDENTIFIED BY ‘PASSWORD’; 会报错,不知道为啥,可能是版本原因。)
删除用户drop user ‘username’@‘host’
如果提示没有权限,授权:grant system_user on . to ‘root’;
更改用户密码:
set password for username = Password(‘newpassword’);
不写用户时,改的是自己的。
操作数据库登录到mysql中,然后在mysql的提示符下运行下列命令,每个命令以分号结束。
1、 显示数据库列表。
show databases;
缺省有两个数据库:mysql和test。 mysql库存放着mysql的系统和用户权限信息,我们改密码和新增用户,实际上就是对这个库进行操作。
2、 显示库中的数据表:
use mysql;
show tables;
3、 显示数据表的结构:
describe 表名;
4、 建库与删库:
create database 库名;
drop database 库名;
5、 建表:
use 库名;
create table 表名(字段列表);
drop table 表名;
eg:
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
name VARCHAr(200) COMMENT '姓名',
age int COMMENT '年龄'
) COMMENT='学生信息';
insert into test_table1 (name,age) values ('lilei',29);
导入导出
导出
导出数据结构以及数据的命令(-u和root要分开): $ mysqldump -u root -p dbName > 想要导出的目录 例如:mysqldump -u root -p dev_sec_ops_dev > /etc/mysql/sql/backup/20211223_full_back.sql 导出某库的某张表: $ mysqldump -u root -p dbName tablename > 想要导出的目录 导出函数和存储过程 (-ntd 表示存储过程 -R 表示函数): $ mysqldump -u root -p -ntd -R dbName > 想要导出的目录 只导出数据库结构,>不带数据<: $ mysqldump -u root -p -d dbName > sqlFilePath -d : 只备份结构,不备份数据。也可以使用”–no-data”代替”-d”,效果一样。导入
导入备份的数据结构以及数据: mysql> source /目录/文件.sql 有问题啊,为什么导不进去? $ mysql -u root -p dbName < 导出时的sql文件所在路径 例如:mysql -u root -p test < G:mysql-8.0.12-winx64dump.sql 导入某张表(先use数据库):
函数和存储过程导入之前需要先
设置 set GLOBAL log_bin_trust_function_creators = 1;
函数和存储过程导入
例如:mysql -u root -p test < G:mysql-8.0.12-winx64fun.sql
mysql服务启动和停止net stop mysql net start mysql用文本方式将数据装入一个数据库表
如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。创建一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以在CREATE TABLE语句中列出的列次序给出,例如:
(这有个tab)aa bb cc
注意:1.需要开启加载本地文件功能
客户端,登录mysql时:
$ mysql --local-infile=1 -uroot -p
服务端,设置加载功能:
mysql> set global local_infile = 1;
2.txt文件自增主键不必设。
使用下面命令将文本文件“mytable.txt”装载到mytable表中:
mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;操作表
创建临时表
create temporary table tablename(name varchar(10));
注意,show tables;并不能查到临时表,但是临时表可以增删改查,删除表;本次连接结束后,临时表会被删除。
创建表是先判断表是否存在
create table if not exists students(……);
从已经有的表中复制表的结构(不包括索引)
create table newtable select * from oldtable where 1<>1;
但这种不好,复制不了主键和索引,
推荐使用(不包括数据)
create table newtable like oldtable;
然后插入数据 insert into newtable selet * from oldtable;
复制表(结构和数据,不包括索引)
create table newtable select * from oldtable;
对表重新命名
alter table newtable rename as oldtable;
创建索引
table table1 add index ind_id (id);
create index ind_id on table1 (id);
create unique index ind_id on table1 (id);//建立唯一性索引
删除索引
drop index idx_id on table1;
alter table table1 drop index ind_id;
联合字符或者多个列(将列id与":“和列name和”="连接)
select concat(id,‘:’,name,‘=’) from students;
limit(选出10到20条)<第一个记录集的编号是0>
select * from students order by id limit 9,10;
查看建表语句:
SHOW CREATE TABLE tbl_name优化
MySQL会使用索引的操作符号
<,<=,>=,>,=,between,in,不带%或者_开头的like
分析索引效率
方法:在一般的SQL语句前加上explain;
分析结果的含义:
1)table:表名;
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
3)possible_keys:查询可以利用的索引名;
4)key:实际使用的索引;
5)key_len:索引中被使用部分的长度(字节);
6)ref:显示列名字或者"const"(不明白什么意思);
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
8)extra:MySQL的建议;
使用optimize table
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
日志
查看是否启用了日志mysql>show variables like ‘log_%’;
查看当前的日志mysql> show master status;
日志类型:
错误日志: -log-err
查询日志: -log
慢查询日志: -log-slow-queries
更新日志: -log-update
二进制日志: -log-bin
默认存放位置 log_bin_basename=/var/lib/mysql
查看字符集
show variables like ‘%char%’;
临时设置客户端的字符集
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;
DESC 表名 --查看表结构



