系统:centos 7 x64

mysql版本:ver 8.42 ,distrib5.7.23

  • mysql安装

本文选择的是:使用yum安装

下载地址:https://dev.mysql.com/downloads/repo/yum/

111.JPG

【linux】Mysql数据库安装与基本操作_第1张图片

右键×××标记,属性,获取下载地址:

linux下输入:wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

安装yum信息:rpm -ivh mysql80-community-release-el7-1.noarch.rpm

安装数据库:yum install mysql-server

####建议不要使用–initialize选项初始化将会给root用户一个随机密码:mysqld --initialize(未测试)

####新5.7以上版本数据库,查看日志发现缺少data目录,官网给出的解决方式是使用命令(mysqld --initialize)先初始化data目录,生成data目录(未测试)

 

开启服务systemctl start mysqld

默认是有安全策略的设置的密码不能是123456

首次登陆用户密码需要输入随机生成的密码

查看随机密码请参照后面的问题一

设置密码:mysqladmin -u root -p password "123456"

更改密码是:mysqladmin -uroot -p'123456' password '654321'

验证 MySQL 安装,显示版本信息:mysqladmin --version

已安装成功。

 

下面就可以使用mysql了

[root@localhost /]# mysql -u root -p
Enter password:

 

可以使用GRANT给用户添加权限,权限会自动叠加,不会覆盖之前授予的权限,比如你先给用户添加一个SELECT权限,后来又给用户添加了一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。

mysql帐户管理


create user 'username'@'hostname' identified by 'password';

username:要创建的用户名

hostname:主机名或ip,指定用户必须在哪台机器登陆,%代表所有。

password:设置密码。

创建用户
grant all privileges on *.* to 'david'@'%' identified by '!QAZ2wsx' with grant option;

all privileges:授予用户的权限,可以改成create,select,update,drop等具体的数据库操作

*.*:表示权限对哪些数据库和表生效,*.*表示所有的数据库,school.student,表示只对school下的student表生效,school.*表示对school整个库生效。

david:授权的用户名,指的是mysql创建的用户名。

%:指定用户名从哪台主机登陆才具有权限。%表示任何主机,如果指定'192,186.1.100',只有在192,186.1.100这台主机登陆才有设置的权限 。

!QAZ2wsx:用户的密码。

with grant option:充许用户将自己的权限给其它用户

创建用户同时授权

grant privileges on 库.表 to 'username'@'hostname'

库.表:指定哪个库和表。

username:用户名

hostname:主机地址

添加权限
revoke create on *.* from 'test1'@'localhost'
回收test1的create权限,同样的如果是 all priviteges回收所有权限。
flush privileges
刷新权限,设置完用户以后必须刷新权限

use mysql;

select * from user\G;

 

use mysql:先运行这句,切换到mysql库

筛选user表里的所有数据,就是所有用户

显示每个用户的所有信息
rename user "test1"@"%' to "tt"@"%"

test1:原用户名

tt:新的名字

改名。。
drop user 'tt'@'%'
删除用户tt





设置mysql用户权限列表访问:

【linux】Mysql数据库安装与基本操作_第2张图片

mysql常用的默认目录:

mysql配置文件:/etc/my.cnf

日志:/var/log/mysqlg.log

PID:/var/run/mysqld/mysqld.pid

  • 常用命令:


命令


mysql
启动mysql管理界面


use
选择要使用的数据库


show databases 显示所有数据库

show tables 显示当前数据库所有表

desc 表名
查看表结构详细信息

show columns form 表名 显示表的所有字段,加/G以字段为段落方式输出

create database 数据库名 charset "utf8" 默认只支持英语,加 charset 'utf8'支持中文 create database testdb charset "utf8"
show create database 库名
显示创建的数据库信息

dorp database 库名 删除数据库

select * from 表名

查看表里的所有数据,

加\G格式化查看数据



SELECT DISTINCT  字段,..... from table 过滤指定字段的重复的数据

create table 表名(

字段名 类型 参数,

多个字段....,

primary key (字段名,字段名...));

类型:int,date,string,bool等等

参数: 可选 ,not null等等

primary key:指定主键

 

创建表

create table students(

id int auto_increment,

name char(32) not null,

age int not null,

register_data date not null,

primary key (id));

select 要显示的字段 from 表名 where 条件表达式或like offset 数 limit 数

显示的字段:*全部字段,也可指定 1,2,3

where:字段>1 and 字段<100

offset:从哪里开始查

limit:显示结果多少条的数据



insert into student (name,age,regester_date) values ('测试1',1,'2018-6-7')


INSERT IGNORE INTO 插入同一条主键数据,不报错,也不修改数据。

INSERT REPLACE INTO 插入同一主键数据,不报错,删掉同一主键的数据,再插入新数据

update 表名 set 字段=值,字段=值。。。。 where 条件表达式或like 更新表里的记录

select 列名1,列名2/* function(列名)

as 别名

 

from 表名

where 条件表达式/like

group by 列名

with rollup

列名1,列名2/*:指定显示的列,*显示所有列

function:

      count统计,分类汇总

      sum统计,分类汇总,并计算所有总数

 

as 别名:为function列起别名

 

表名:要统计的表

条件表达式/like:指定条件,like 模糊匹配字符

group by:按指定列分组统计

 

with rollup:显示所有的计数项的总和

 

给总计项起名:

select coalesce(name,'起的名字'),sum(age) from student group by name with rollup

group by 分类汇总

 

 


alter table 表名 function 字段名 类型

not null

deafult 值

 

 

 

 

 

 

 

 

function:

  drop-删除字段

  add-添加字段

  modify-修改字段数据类型,设置不为空的时候需要把字段type全都写全。

 

  change-修改字段名,方法是紧跟字段名,然后指定新字段名和类型。

 

not null 设定字段不为空

 

deafult:指定默认值

alter table:操作表结构
alter添加外键关联

ALTER TABLE user_info ADD u_address VARCHAR(64) ;

ALTER TABLE user_info CONSTRAINT addr FOREIGN KEY(u_address) REFERENCES address(zone);
# user_info :本表名

# u_address: 本表要添加外键的字段名

# addr: 给外键起个名

# address(zone):外部表名(和它的字段)

delete from 表名 where 条件或like 删除符合条件的记录

order by 字段 desc或asc

子句:用于显示结果按指定字段排序

 



添加mysql服务器帐户

use mysql;

frant All on 库名.表名 to "alex"@"localhost" indentified by 'Madeincina!'



alter user 'root'@'%' IDENTIFIED BY 'Tel123??'

root:目标用户名

'%':用户登陆权限,mysql库查看user表的Host字段值

'Tel123??':修改的密码

修改用户密码

show grants for 用户名 查看用户的权限信息

  • mysql数据类型

1、整型

MySQL数据类型 含义(有符号)
tinyint(m) 1个字节  范围(-128~127)
smallint(m) 2个字节  范围(-32768~32767)
mediumint(m) 3个字节  范围(-8388608~8388607)
int(m) 4个字节  范围(-2147483648~2147483647)
bigint(m) 8个字节  范围(+-9.22*10的18次方)

取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。

2、浮点型(float和double)

MySQL数据类型 含义
float(m,d) 单精度浮点型    8位精度(4字节)        m总个数,d小数位
double(m,d) 双精度浮点型    16位精度(8字节)       m总个数,d小数位

设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。

3、定点数

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d

4、字符串(char,varchar,_text)

MySQL数据类型 含义
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符

char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。

varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

5.二进制数据(_Blob)

1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能整体读出。
3._TEXT可以指定字符集,_BLO不用指定字符集。

6.日期时间类型

MySQL数据类型 含义
date 日期 '2008-12-2'
time 时间 '12:25:36'
datetime 日期时间 '2008-12-2 22:06:44'
timestamp 自动存储记录修改时间

若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

数据类型的属性

 

MySQL关键字 含义
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 默认值
PRIMARY KEY 主键
AUTO_INCREMENT 自动递增,适用于整数类型
UNSIGNED 无符号
CHARACTER SET name 指定一个字符集

 

 

  • 多表操作

外键关联:


create table source (

'id' int auto_increment not null

'stu_id' not null,

'sex' enum('M','F') not null,

'age' int not null

key fk_stu_id(stu_id)

constraint fk_stu_id foreign key (stu_id) references student (id))

 

key:

 

constraint :



连接查询:


inner join 内链接


select * from A inner join B on A.name =B.s_name

查询A表name列与B表s_name列相等的记录

select A.*,B.* from A,B where A.name =B.s_name 同上,两种不同写法

多对多,带中间表。

A表和B表通过中间表C关联。

查询A的name在B里对应记录?

 

select B.* from A inner join C on C.a_id = A.id inner join B on B.id = C.b_id and A.name ='test';

left join select * from A left join B on A.name=b.s_name A表全显示,B表只显示 on关键字后面的 条件,不符条件的显示null








right join
select * from A left join B on A.name=b.s_name B表全显示,A表如果没有 符合on后的条件,则为null




UNION

合并查询结果




select * from A left join B on A.name=B.name union select * from A right join B on A.name=B.name 

A,B表全显示,不符on后条件的显示null

相当于oracl的full join


NULL值的处理 NULL与任何值都不相等,即使 NULL=NULL也返回为false
is null 空,反回True

is not null 非空,返回True

null与null比较也是空 返回False

<==>


复制表 没有直接复制命令,先复制结构,再复制全部数据
create table newtable like oldtable

oldtable:要复制的表名

newtable:新表名

 

把oldtable表结构复制到newtable
insert into newtable select * from oldtable

oldtable:要复制的表名

newtable:新表名

把oldtable内容全部复制到新表里




MTSQL管理界面有选择的复制表


show create database oldtable\G 显示旧表的结构创建命令

 

复制上一条命令的结果,改oldtableq

名字



insert into newtable (字段名,.....)

select 字段名,..... from oldtable

两个表的字段需要对应,可以有选择的复制。









SELECT...INTO OUTFILE 把内容输出到文件

mysql> SELECT * FROM runoob_tbl     

-> INTO OUTFILE '/tmp/runoob.txt';

runoob_tbl 数据导出到 /tmp/runoob.txt 文件中

mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'    

-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'    

-> LINES TERMINATED BY '\r\n';

指定输入格式,CSV格式

mysqldump -h other-host.com -P port -u root -p database_name > dump.txt password ****

如果你需要将远程服务器的数据拷贝到本地,你也可以在 mysqldump 命令中指定远程服务器的IP、端口及数据库名。

在源主机上执行以下命令,将数据备份到 dump.txt 文件中







事务:

只有Innodb引擎才支持事务,主要是为了一次性删除不同表里的关联数据。mysql默认支持。

事务的四个条件:

原子性:一组数据操作,要么成功,要么撤回。

稳定性:有非法数据(外键约束之类),事务撤回。

隔离性:一个事务处理后,影响到其它事务,那么其它事务撤回。

可靠性:数据库崩溃后,Innodb数据表驱动会利用日志文件重构修改。

innodb_flush_log_at_trx_cmmit选项设置什么时候把事务保存到日志。

begin 开始一个事务

rollback 回滚,到begin,事务结束

commit 提交事务,事务结束





索引:

索引提高查询速度,但会降低增改删速度,因为这三个操作会同时更新索引。

创建索引要使用唯一字段,一般是主键,如果双字段才能确定一条记录,就用双字段创建索引。

表默认索引是主键

create index 索引名 on 表名(表字段(length))

添加索引

lengh:长度小于字段值长度



ALTER TABLE tableName ADD INDEX indexName(columnName)  修改表结构方式添加索引 





show index from 表名 查看索引,/G格式化查看

drop index indexname on tablename 删除tablename表中的indexname索引

  • 异常处理:

 

问题一:

mysql5.7第一次登陆系统的时候需要使用临时密码。

查看log文件获取密码,我的密码是&FZLoUXjr3HD

[root@localhost /]# cat /var/log/mysqld.log | grep password 
2018-11-21T12:44:58.038430Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: &FZLoUXjr3HD

然后再运行改密码的命令,1qaz2wsx这个密码并不符合复杂度要求。请自行设置

[root@localhost /]# mysqladmin -u root -p password "1qaz2wsx"
Enter password:         # 这个位置输入上面的临时密码
[root@localhost /]# mysqladmin -u root -p password "tmrd2018-@WSX-Server"
Enter password: 
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

 方法二:

    1\在my.cnf添加skip-grant-tables跳密码

    2\重启服务:systemctl restart mysqld

MySQL5.7.9以前使用:(未测试)

update mysql.user set password=password('123456') where user='root';

 

 新版本user表使用了authentication_string代替password字段,并取消了password函数,

#authentication_string字段是加密处理过的,所以不能直接更改。先给密码设为空
update mysql.user set authentication_string=''  where user='root';

     3\删掉my.cnf的skip-grant-tables

     4\重启mysqld服务

     5\使用空密码进入mysql

mysql -u root -p
#提示密码直接回车进入mysql

    6\修改密码

alter user 'root'@'localhost' identified by 'Tel6166??';
#localhost是根据mysql库的user表的host字段值决定的。否则提示 ERROR 1396(HY000):operation user alter failed for 
# 刷新权限
flush privileges;





问题二:

    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

原因:

    这是密码错了。

    改完密码,删掉my.cnf的skip-grant-tables

    再重启服务就报这个错误。

    所以怀疑删错东西了。

 

解决方法

    查看mysql最近的报错日志-ERROR:

    cat /var/log/mysqld.log | grep ERROR | tail -n 20

    提示

    unkown variable 'id-file=/var/run/mysqld/mysqld.pid

    添加文件夹权限依旧

    chown -R mysql /var/run/mysqld
    chgrp -R mysql /var/run/mysqld

 

    网上的方法都找过了,也不想重写配置文件,后来对比配置文件的时候发现了

    修改my.cnf的时候,不小心把pid-file改成id-file了!!!

    改回pid-file完美解决。白白浪费了12小时。。。

 

 

问题三:

    mysqld服务启动不起来。

    提示:Process: 8254 ExecStart=/usr/sbin/mysqld $mysqld_opts (code=exited, status=1/FAILURE)

原因:

    有可能是使用xshell操作mysql的时候意外退出。

 


解决方法

    查看日志:(日志路径在/etc/my.cnf中)

cat /var/log/mydql.log

日志:[ERROR] InnoDB: Unable to lock ./ibdata1, error: 11

首先想到的是权限问题,权限没有问题

然后看了一下系统进程,发现mysql有一个进程在运行,说明这个文件正在被占用,所以不能获取权限。

查看进程
ps aux | grep my
关闭进程
kill pidnumber
重启mysqld
systemctl restart mysqld

完美解决。

 

问题四:

    不能远程连接mysql数据库

解决方法:

    mysql默认不允许远程,进入mysql命令行里面,更改root的host选项。

mysql>use mysql;
mysql>update user set Host='%' where User='root';
mysql>flush privileges;

问题五:

    表名是关键字,如from,group,select等等 ,怎么访问?

表名前加库名

select * from student.group;


 

 

http://×××w.runoob.com/mysql/mysql-administration.html

 

mysql练习题 http://×××w.cnblogs.com/wupeiqi/articles/5729934.html

   

 

更多mysql知识,请看http://×××w.cnblogs.com/wupeiqi/articles/5713323.html

https://×××w.cnblogs.com/alex3714/articles/5950372.html