简单梳理安装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,执行命令
[ ]
从执行结果,可以看出我们已经安装了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
再次执行查询命令,查看是否删除
[ ]
2、查询所有Mysql对应的文件夹
[ ]
mysql: /usr/bin/mysql /usr/include/mysql
[ ]
/data/mysql
/data/mysql/mysql
删除相关目录或文件
[root@localhost /]# rm -rf /usr/bin/mysql /usr/include/mysql /data/mysql /data/mysql/mysql
验证是否删除完毕
[ ]
mysql:
[ ]
3、检查mysql用户组和用户是否存在,如果没有,则创建
[ ]
[ ]
[ ]
[ ]
[ ]
4、从官网下载是用于Linux的Mysql安装包
下载命令:
[ ]
也可以直接到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目录
[ ]
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 mysql
useradd -r -g mysql mysql
#useradd -r参数表示mysql用户是系统用户,不可用于登录系统
[ ]
[ ]
4、编译安装并初始化mysql,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)
[ ]
[ ]
补充说明:
此时可能会出现错误:
出现该问题首先检查该链接库文件有没有安装使用 命令进行核查
[ ]
[root@localhost bin]#
运行命令后发现系统中无该链接库文件
[ ]
安装成功后,继续运行数据库的初始化命令,此时可能会出现如下错误:
执行如下命令后,再次运行数据库的初始化命令:
[ ]
5、运行初始化命令成功后,输出日志如下:
记录日志最末尾位置root@localhost:后的字符串,此字符串为mysql管理员临时登录密码。
6、编辑配置文件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服务器
[ ]
显示如下结果,说明数据库安装成功
如果出现如下提示信息
Starting MySQL... ERROR! The server quit without updating PID file
查看是否存在mysql和mysqld的服务,如果存在,则结束进程,再重新执行启动命令
#查询服务
ps -ef|grep mysql
ps -ef|grep mysqld
#结束进程
kill -9 PID
#启动服务
/usr/local/mysql/support-files/mysql.server start
8、添加软连接,并重启mysql服务
[ ]
[ ]
[ ]
9、登录mysql,修改密码(密码为步骤5生成的临时密码)
[ ]
Enter password:
set password for root@localhost = password('yourpass');
10、开放远程连接
use mysql;
update user set user.Host='%' where user.User='root';
flush privileges;
11、设置开机自动启动
1、将服务文件拷贝到init.d下,并重命名为mysql
[ ]
2、赋予可执行权限
[ ]
3、添加服务
[ ]
4、显示服务列表
[ ]
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相对范围要小很多
日期与字符串转换:
//日期转字符串
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)