vlambda博客
学习文章列表

简单梳理安装Mysql和常用总结

花了点时间稍微整理了一下Mysql安装和使用的相关知识,大多是工作中常用或者偶尔会用上的:

Linux常用命令

安装linux和oracle都需要在linux系统进行,有必要熟悉一些常用的linux命令;

linux系统相关命令

# 查看当前登录用户

who

# 立刻/十分钟后重启

shutdown -h now

//shutdown -h +10

# 重启

reboot


用户相关命令

# 添加用户

adduser codeer

# 这个用户不想用了,删除

deluser -r codeer

# 添加一个新的用户组

groupadd group1

# 添加用户组并指定用户号

groupadd -g 501 group2

# 删除用户组

groupdel group2

# 将dir1文件夹下的文件修改用户组

chgrp -vR group1 ./dir1

# 将dir文件夹下的文件所有者和用户组修改

chown -Rv own_name:group_name ./dir

#更改文件的属性

chmod -Rv 755 ./dir



文件目录相关命令

ls //默认列出当前目录下文件的信息,横向排列

ls -al //列出文件的详细信息

ls -alh //显示文件的大小

#查看当前路径

pwd

#创建目录

mkdir /xxx

# 设置目录的访问权限

mkdir -m 755

# 递归循环创建目录

mkdir -p ./test/codeer

# 删除test目录下的codeer目录

rmdir test/codeer

# 把test目录一起删除

rmdir -p test/codeer


rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉

-f:不提示,强制删除文件或目录;
-i:删除已有文件或目录之前先询问用户;
-r,-R:递归删除,将指定目录下的所有文件与子目录一并删除;

# 强制递归删除文件,建议备份

rm -rf file

# 交互式删除文件

rm -i file


mv命令用来为文件或目录改名、或将文件或目录移入其它位置。

mv 文件名 文件名    将源文件名改为目标文件名

mv 文件名 目录名    将文件移动到目标目录

mv 目录名 目录名    目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名


# 给source file建立软连接文件(快捷方式)

ln -s source_file_name link_file_name


touch

没有文件就创建文件,有这个文件就修改文件的访问时间


文件查看命令

cat a 查看名为a的文件


grep :针对文件内容进行过滤查看

grep‘^root’ /etc/passwd 【查找以root开头的行数】
grep ‘bash$’ /etc/passwd 【查找以bash结尾的行数】


head -n -20 file      //查看file文件倒数20行以前的内容

tail -n +100 file     //查看file文件100行以后的数据


查找命令

which ifconfig        //查找ifconfig的来源

whereis ifconfig      //查找ifconfig文件(该命令搜索时搜索的是数据库而非直接搜索磁盘)

locate passwd         //查找passwd文件


find命令用来在指定目录下查找文件

#将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:

find . -name "*.c"



压缩和解压缩命令

tar
  解包:tar zxvf filename.tar
  打包:tar czvf filename.tar dirname


zip命令
    解压:unzip filename.zip
    压缩:zip filename.zip dirname


Mysql安装

主要参考:Linux下安装mysql(仅学习) - 知乎 (zhihu.com)

一 安装前准备

1、检查是否已经安装过mysql,执行命令

[root@localhost /]# rpm -qa | grep mysql

简单梳理安装Mysql和常用总结


从执行结果,可以看出我们已经安装了mysql-libs-5.1.73-5.el6_6.x86_64,执行删除命令

[root@localhost /]# rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64

再次执行查询命令,查看是否删除

[root@localhost /]# rpm -qa | grep mysql

简单梳理安装Mysql和常用总结


2、查询所有Mysql对应的文件夹

[root@localhost /]# whereis mysql

mysql: /usr/bin/mysql /usr/include/mysql

[root@localhost lib]# find / -name mysql

/data/mysql

/data/mysql/mysql

删除相关目录或文件

[root@localhost /]# rm -rf /usr/bin/mysql /usr/include/mysql /data/mysql /data/mysql/mysql

验证是否删除完毕

[root@localhost /]# whereis mysql

mysql:

[root@localhost /]# find / -name mysql

3、检查mysql用户组和用户是否存在,如果没有,则创建

[root@localhost /]# cat /etc/group | grep mysql[root@localhost /]# cat /etc/passwd |grep mysql[root@localhost /]# groupadd mysql[root@localhost /]# useradd -r -g mysql mysql[root@localhost /]#

4、从官网下载是用于Linux的Mysql安装包

下载命令:

[root@localhost /]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

也可以直接到mysql官网选择其他版本进行下载。

二 安装Mysql

1、在执行wget命令的目录下或你的上传目录下找到Mysql安装包:mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
执行解压命令:

[root@localhost /]# tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz[root@localhost /]# ls

mysql-5.7.24-linux-glibc2.12-x86_64

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

解压完成后,可以看到当前目录下多了一个解压文件,移动该文件到/usr/local/mysql
执行移动命令:

[root@localhost /]# mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql

2、在/usr/local/mysql目录下创建data目录

[root@localhost /]# mkdir /usr/local/mysql/data

3、更改mysql目录下所有的目录及文件夹所属的用户组和用户,以及权限

添加加系统mysql组和mysql用户

检查mysql组和用户是否存在,如无创建

cat /etc/group | grep mysql

#类似

mysql:x:1004:

cat /etc/passwd | grep mysql

#类似

mysql:x:1004:1004::/home/mysql:/sbin/nologin

#以上为存在的情况,如无,执行添加命令:

groupadd mysqluseradd -r -g mysql mysql

#useradd -r参数表示mysql用户是系统用户,不可用于登录系统

[root@localhost /]# chown -R mysql:mysql /usr/local/mysql[root@localhost /]# chmod -R 755 /usr/local/mysql

4、编译安装并初始化mysql,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)

[root@localhost /]# cd /usr/local/mysql/bin[root@localhost bin]# ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

补充说明:

此时可能会出现错误:

简单梳理安装Mysql和常用总结

出现该问题首先检查该链接库文件有没有安装使用 命令进行核查

[root@localhost bin]# rpm -qa|grep libaio

[root@localhost bin]#

运行命令后发现系统中无该链接库文件

[root@localhost bin]# yum install libaio-devel.x86_64

安装成功后,继续运行数据库的初始化命令,此时可能会出现如下错误:

简单梳理安装Mysql和常用总结

执行如下命令后,再次运行数据库的初始化命令:

[root@localhost bin]# yum -y install numactl

5、运行初始化命令成功后,输出日志如下:

简单梳理安装Mysql和常用总结

记录日志最末尾位置root@localhost:后的字符串,此字符串为mysql管理员临时登录密码。

6、编辑配置文件my.cnf,添加配置如下

[root@localhost bin]# vi /etc/my.cnf

#以下为my.cnf内容

[mysqld]

datadir=/usr/local/mysql/data

port = 3306

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

symbolic-links=0

max_connections=400

innodb_file_per_table=1

#表名大小写不敏感,敏感为

lower_case_table_names=1

7、启动mysql服务器

[root@localhost /]# /usr/local/mysql/support-files/mysql.server start

显示如下结果,说明数据库安装成功

简单梳理安装Mysql和常用总结

如果出现如下提示信息

Starting MySQL... ERROR! The server quit without updating PID file

查看是否存在mysql和mysqld的服务,如果存在,则结束进程,再重新执行启动命令

#查询服务

ps -ef|grep mysqlps -ef|grep mysqld

#结束进程

kill -9 PID

#启动服务

/usr/local/mysql/support-files/mysql.server start

简单梳理安装Mysql和常用总结


8、添加软连接,并重启mysql服务

[root@localhost /]# ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql[root@localhost /]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql[root@localhost /]# service mysql restart

9、登录mysql,修改密码(密码为步骤5生成的临时密码)

[root@localhost /]# mysql -u root -p

Enter password:

mysql>set password for root@localhost = password('yourpass');

简单梳理安装Mysql和常用总结


10、开放远程连接

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

简单梳理安装Mysql和常用总结


11、设置开机自动启动

1、将服务文件拷贝到init.d下,并重命名为mysql

[root@localhost /]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

2、赋予可执行权限

[root@localhost /]# chmod +x /etc/init.d/mysqld

3、添加服务

[root@localhost /]# chkconfig --add mysqld

4、显示服务列表

[root@localhost /]# chkconfig --list




Mysql常用操作

创建数据库/用户/赋权限

create database if not exists test default character set utf8 collate utf8_general_ci;--创建数据库

drop DATABASE if exists my_database;--删除数据库

-- 显示所有的数据库

SHOW DATABASES;

-- 显示数据库的创建结构

SHOW CREATE DATABASE my_database;

--指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%

CREATE USER 'u_test'@'%' IDENTIFIED BY 'mysql';

--授权,用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL

GRANT privileges ON test.tablename TO 'username'@'host';

grant all privileges on test.* to 'u_test'@'%' identified by 'mysql';

--命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库 (MySQL数据库的内置库)中提取到内存里。

--MySQL用户数据和权限有修改后,希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。

flush privileges;




创建表

-- 建表语句例子

CREATE TABLE `table_user` (

`user_id`  bigint NOT NULL AUTO_INCREMENT,

`username`  varchar(50) NOT NULL COMMENT '用户名',

`password`  varchar(100) COMMENT '密码',

`salt`  varchar(20) COMMENT '盐',

`email`  varchar(100) COMMENT '邮箱',

`mobile`  varchar(100) COMMENT '手机号',

`status`  tinyint COMMENT '状态  0:禁用   1:正常',

`create_user_id`  bigint(20) COMMENT '创建者ID',

`create_time`  datetime COMMENT '创建时间',

PRIMARY KEY (`user_id`),

UNIQUE INDEX (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户'



--查看表结构

show create table table_user;

desc table_user;


Drop table if exists tbl_name1,tbl_name2;

-- truncate仅删除内容,保留表结构

TRUNCATE tbl_name1;




-- 表结构修改

-- 添加字段,AFTER表示在某列之后

ALTER TABLE <表名>  ADD  <新字段名> <数据类型> [约束条件]  [FIRST|AFTER已存在的字段名];

ALTER TABLE table_user ADD COLUMN `job` VARCHAR(50) NOT NULL COMMENT '工作' AFTER address;


-- 删除表字段

ALTER TABLE table_user DROP COLUMN `job`;


-- 修改表字段类型

ALTER TABLE table_user MODIFY COLUMN job VARCHAR(100) NOT NULL DEFAULT '无业' COMMENT '工作';


-- 修改表字段名称

ALTER TABLE table_user CHANGE COLUMN job job_type VARCHAR(100) NOT NULL DEFAULT '无业' COMMENT '工作类型';


--插入数据

  • 插入完整的行;

  • 插入行的一部分;

  • 插入某些查询的结果。


INSERT INTO ` table_user ` (`column1`, ` column2`, ` column3`, ` column4`) VALUES

(‘A’, 1111111, ‘xxxxxxxxxxxxxx’, '2021-03-23 22:37:41'),

(‘B’, 2222222, 'vvvvvvvvvv', '2021-03-23 22:37:41');

字符串数据需要加引号


--删除数据

DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...]    [LIMIT row_count]


--更新数据

update tbl_name set col1=value1,col2=value2 where 条件 [order by] [limit]

--用A表更新B表

UPDATE  b, a

SET b.name = a.name,

b.sex = a.sex,

b.age = a.age

WHERE b.student_id = a.student_id;

或者可以这样

UPDATE  b

INNER JOIN  a ON a.student_id=b.student_id

SET b.name=a.name,

b.age=a.age,

b.sex=a.sex;

建表/主键/外键

主键唯一标识一条记录的一列或者多列的组合。

每个表只能定义一个主键;每一行都必须具有一个主键值(主键列不允许NULL值);

主键列中的值不允许修改或更新;主键值不能重复使用(如果某行从表中删除,它的主键不能赋给以后的新行)。


create table tbl_user

(

user_id int,

user_name varchar(20),

primary key(user_id)

);


--为表新增主键

alter table tbl_user add primary key(user_id,user_name);

ALTER TABLE tbl_test1 ADD CONSTRAINT pk_tbl_test1 PRIMARY KEY(id);


-- 删除主键(假如主键列具有auto_increment属性,需要先删除自增长属性,再删除主键)

ALTER  TABLE  TABLE_NAME  DROP  PRIMARY  KEY;


外键(FK,foreign key):一个A表的字段指向另一个B表的主键,该字段就为A表的外键。用于表示表之间的关系

外键只被innodb存储引擎所支持。其他引擎是不支持的。一个表可以存在一个或者多个外键。

create table tbl_user

(

user_id int primary key,

user_name varchar(20),

class_id int,

CONSTRAINT fk_tbl_user foreign key(class_id) references tbl_class(class_id)

)

--为表增加外键

alter table tbl_user add CONSTRAINT fk_tbl_user foreign key(class_id) references tbl_class(class_id);


-- 删除外键

alter table tbl_user drop foreign key fk_tbl_user;


外键所在的表为子表,子表在写入数据操作时,如果外键字段在关联表中找不到对应的匹配,操作就会失败;对关联表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作也会失败。

外键有三种约束模式:

  • district:严格模式(默认), 关联表不能删除或更新一个被子表引用的记录的主键值;

  • cascade:级联模式, 关联表的主键值操作后,子表关联的数据也跟着一起操作;

  • set null:置空模式,前提外键字段允许为NLL, 关联表的主键值操作后,子表对应的字段被置空。




Unique和Primary Key

一个表可以有多个字段声明为 Unique,该列可以为空;一个表只能有一个Primary Key,且该列不能为空值。

CREATE TABLE tbl_test2

(

id INT,

name1 VARCHAR(20),

nick_name VARCHAR(20),

age INT,

CONSTRAINT unique_tbl_test2_name UNIQUE(name1,nick_name)

)

--为表增加unique约束

alter table tbl_test2 add constraint unique_tbl_test2_name UNIQUE(name1,nick_name);


-- 删除唯一性约束(从下面的语法我们可以看出唯一性约束其实是个索引)

alter table tbl_test2 drop index unique_tbl_test2_name


检查数据库表中某些字段时候符合条件/给字段赋默认值

检查字段

CREATE TABLE tbl_test3

(

id INT,

name1 VARCHAR(20),

nick_name VARCHAR(20),

age INT,

CONSTRAINT check_tbl_test3 CHECK(age>20 AND age<40)

)

--为表某字段加上检查条件

alter table table_test3 add constraint check_tbl_test3 check(age>20 and age<40);


-- 删除检查约束

alter table tbl_test3 drop constraint check_tbl_test3




给字段赋默认值

CREATE TABLE tbl_test4

(

id INT PRIMARY KEY AUTO_INCREMENT,

`name` VARCHAR(20) DEFAULT 'wuming',

age INT

)

--为表某字段设置默认值

ALTER TABLE tbl_test4 MODIFY COLUMN age INT DEFAULT 20;

-- 删除默认值(删除age字段的默认值)

ALTER TABLE tbl_test4 CHANGE COLUMN age age INT DEFAULT NULL;



索引

索引用于快速查询某列数据的某一行,如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止;如果该列有一个索引,相当于用查字典的方式去查询这条数据,会节省很大一部分时间;牺牲的是创建索引的时间和空间,以及对数据进行DML操作时增加了数据的维护成本。


主键约束,就是一个主键索引;唯一性约束其实也是个索引;

  • 单列索引:对某一列数据设置索引,比如普通索引,唯一索引,主键索引

  • 组合索引:对表中的多个字段列组合创建的索引;

  • 全文索引:在长文本中,通过其中的某个关键字等,就能找到该字段对应的记录,只可在CHAR,VARCHAR,TEXT等文本类型字段上使用,同时必须在MyISAM引擎上才能使用;

  • 空间索引:对空间数据类型的字段建立的索引,列为NOT NULL,必须在MyISAM引擎上才能使用;



Null和空值

  • NULL在字段中存储NULL值,空值在字段中存储空字符('');空值('')的长度是0,不占用空间;NULL长度是NULL,占用空间。

  • 查询NULL,使用 is null/is not null;查询空值,使用 = ‘’、!=‘’

  • COUNT(字段) 统计会过滤 NULL 值,即不统计NULL值;不会过滤掉空值

  • NOT IN、!= 等负向条件查询在该列有NULL值的情况下,返回的结果集会出现问题;比如不等于某个值的条件下,查询结果集中不会返回包含该列为null的记录行;




日期

TIMESTAMP类型把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,再将其转化为客户端当前时区返回。

DATETIME,不做任何改变,基本上是原样输入和输出。

TIMESTAMP相对范围要小很多


简单梳理安装Mysql和常用总结

日期与字符串转换:


//日期转字符串

DATE_FORMAT(NOW(),'%Y-%m-%d %H-%i-%s')

DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')

DATE_FORMAT(NOW(),'%m-%d-%Y')

DATE_FORMAT(NOW(),'%d %b %y')

DATE_FORMAT(NOW(),'%d %b %Y %T:%f')


//字符串转日期

str_to_date('2021-01-02', '%Y-%m-%d %H')


//字符串转时间戳

select unix_timestamp('2021-01-02');  




存储引擎

区别于其他数据库的最重要的一个特点在于,MySQL数据库的插件式的表存储引擎, MySql支持很多种存储引擎,且存储引擎是基于表的,非数据库。


最常用的三种存储引擎:

  • InnoDB:MySQL默认的存储引擎,支持事务、支持行级锁和表级锁、支持各类索引、支持外键,高版本的MySQL还支持全文索引,但批量数据插入的效率较低;要提供提交、回滚和恢复的事务安全(ACID兼容)能力,并要求实现并发控制,选择InnoDB才可以满足;

  • MyISAM:具有较高的数据插入效率和数据查询速度,支持全文索引,但是不支持数据库事务,不支持行级锁,只支持表级锁;数据表主要用来插入和查询记录,可考虑该引擎;

  • MEMORY:使用这个存储引擎时,会将表中的数据加载到内存中,查询很快,但是对内存要求较高。临时存放数据,数据量不大,并且不需要较高的数据安全性时可以选择将数据保存在内存的MEMORY引擎中,MySQL中使用该引擎作为临时表,存放查询的中间结果。




备份

cp进行备份

如果数据量较小, 直接cp,tar复制数据库文件

SHOW DATABASES; #查看当前的数据库use test;SHOW TABLES; #查看当前库中的表select count(*) from t_mould_ccwlxx;FLUSH TABLES WITH READ LOCK; #向所有表施加读锁mkdir /backup #创建文件夹存放备份数据库文件cp -a /var/lib/mysql/* /backup #保留权限的拷贝源数据文件,源数据文件

需要参考自己所安装的目录,不一定是/var/lib/mysql

ls /backup #查看目录下的文件rm -rf /var/lib/mysql/* #假设模拟数据库数据全部清空,删除数据库的所有文件service mysqld restart #重启MySQL,失败cp -a /backup/* /var/lib/mysql/ #将备份的数据文件拷贝回去service mysqld restart #重启MySQL

SHOW DATABASES;    #此时的数据库已恢复


更多备份参考

mysql备份恢复详解 - coshaho - 博客园 (cnblogs.com)