随着需求的不断升级,我们存储数据的方式也在不断升级,最开始的文本记录,人工管理。到后来的文件系统,电子化操作。再到现如今的数据库管理阶段。
我们一直在使用数据库:站点搜索资料;登录用户名和密码(银行,邮箱);atm取钱。
数据库系统就是一套对大量信息进行管理的高效方法而已。
数据信息的来源:科研数据,商业账目记录,学生信息,销售业绩,员工信息等等。
数据库的好处:
1、缩短信息记录的录入时间。
2、缩短信息的检索时间。
3、灵活的信息检索顺序。
4、输出格式灵活。
5、信息记录能够被多人使用。
6、信息记录的远程访问和电子传输。
但是,并不是所有的数据都要存放在数据库中。比如采购物品的清单,买一个东西少一样,下次用不一定什么么时候了,就不需要使用数据库。
数据库分为关系型和非关系型数据库。关系型就像我们熟悉的Excel表,非关系型数据库就比较抽象了,主要做缓存,比如Redis。
数据库的构成:
数据库管理系统 DBMS(DataBase Management System)
数据库管理员DBA(DataBase Administrator)
用DBMS来访问DBserver。其实我们常说的MySQL就是数据库管理系统。
我们常见的数据库管理系统软件:ORACLE、SQL Server、DB2、MySQL。
数据库的访问技术我就知道:
JAVA 的 JDBC。不过用的最多的还是封装了JDBC的框架MyBatis,hibernate等等。
Python 的 ODBC。
MySQL的主要分支版本有:percona server,MariaDB这两大分支。
RHEL7使用MariaDB替换原生的MySQL。
回想一下在CentOS中也有一个东西locate,其实locate里也有一个数据库原始文件,locate就是查询那个数据库原始文件来进行文件内容的搜索的(但这个并不是数据库)。所以在使用locate是我都习惯性的更新下数据。
mysql的安装:
法1:源码安装,编译然后安装。
./configure
make
make install
法2:bin包安装,就相当于绿色版。一般解压缩就能用。
法3:直接rpm包安装。
我用的是bin包。比较麻烦。
首先自然是要下载这个bin包了。
在开始之前要先安装这个包。
[root@localhost ~]# yum install libaio libaio-devel -y
这个是异步IO也是mysql或者oracle所需要的的依赖。
1、首先要解压缩到一个位置。我就选择/usr/local/了。
[root@localhost ~]# tar zxf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
解压之后可以创建一个链接文件,指向mysql解压出来的目录,那个目录名字太长了。
[root@localhost ~]# ln -s /usr/local/mysql-5.7.18-linux-glibc2.5-x86_64/ /usr/local/mysql
2、添加用户,MySQL的运行要用到,mysql用户,mysql用户要在mysql组中,UID,GID为27.
[root@localhost local]# groupadd -g 27 mysql
[root@localhost local]# useradd -u 27 -g 27 -s /sbin/nologin mysql
3、分配权限,将解压出来的目录的属组和属主都变为mysql
[root@localhost local]# chown -R mysql:mysql mysql-5.7.18-linux-glibc2.5-x86_64/
4、/etc/my.cnf文件,配置文件。
这个之前要先删除CentOS自带的数据库mariadb-libs
[root@localhost ~]# yum erase mariadb-libs -y
然后直接写个这个my.cnf。选项如下。
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /tmp/mysql.sock
pid-file = /data/mysql/run/mysql.pid
datadir = /data/mysql/data
general_log_file = /data/mysql/log/mysql-access.log
log-error = /data/mysql/log/mysql-error.log
expire_logs_days = 3
lower_case_table_names = 0
skip-external-locking
query_cache_type = 1
query_cache_size = 128M
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
tmpdir = /data/mysql/tmp
slave-load-tmpdir = /data/mysql/tmp
tmp_table_size = 32M
max_heap_table_size = 32
max_connections = 2000
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
innodb_data_home_dir = /data/mysql/innodb
innodb_data_file_path = ibdata1:512M:autoextend
innodb_log_group_home_dir = /data/mysql/innodb
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
relay-log = /data/mysql/relay-log/slave_relay_bin
relay-log-index = slave_relay_bin.index
log-slave-updates
binlog_format = row
server-id = 21
log-bin = /data/mysql/binlog/binlog
log-bin-index = binlog.index
innodb_log_buffer_size = 16M
5、创建目录,并分配权限:
[root@localhost ~]#mkdir /data/mysql/{run,data,tmp,innodb,log,relay-log,binlog,etc} -p
[root@localhost ~]# chown -R mysql:mysql /data/mysql/
6、初始化:
[root@localhost ~]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
[root@localhost ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql/data
如果初始化报如下错的话。
[root@localhost ~]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
2019-11-26T09:52:58.761637Z 0 [Warning] option 'max_heap_table_size': unsigned value 32 adjusted to 16384
2019-11-26T09:52:58.761821Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-11-26T09:52:58.766262Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2019-11-26T09:52:58.766308Z 0 [ERROR] Aborting
检查解压出来的文件 和 创建的data目录结构,文件的权限是否是mysql。如果都没有异常,删除/data/mysql/data/这个目录下的所有文件,然后重新执行初始化命令。
7、启动服务
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
第一次启动服务就报错的话,检查初始化。
8、查看初始密码
[root@localhost /]# grep "root@localhost" /data/mysql/log/mysql-error.log
2019-11-26T09:54:29.656507Z 1 [Note] A temporary password is generated for root@localhost: *(tTD(9>Baye
//最后那个就是初始密码了,*(tTD(9>Baye。。。。。。
从mysql5.7开始就有初始密码了。
到这里,安装就结束了。
因为是bin包,直接解压缩的,所以在$PATH变量里没有这相关的命令。最好手动添加下,要不然的话每次都要输很长的目录。每次启动服务是都要这样:
[root@localhost /]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
进行如下操作。
[root@mysql-bin ~]# vim /etc/profile
PATH=/usr/local/mysql/bin:$PATH
//就是在这个目录中添加一行
[root@mysql-bin ~]# . /etc/profile
//然后重新加载系统环境配置文件。
然后就可以直接使用mysql命令,不用加前边的目录了。
不过那个初始密码不好记,要修改下。
修改初始密码:
[root@mysql-bin ~]# mysql -u root -p
Enter password: 初始密码 先用初始密码登录再改
mysql> alter user root@'localhost' identified by 'mysql';
PS:也可以直接修改mysql数据库中的user表对应行。
mysql> flush privileges;
mysql> quit
//进入mysql修改密码然后刷新权限列表
[root@mysql-bin ~]# mysql -u root -p
Enter password: 新密码
//再次登陆时就可以使用新密码了。
RPM包安装就要省事的多:
有yum源的话直接安装就好了。
然后启动服务和开机启动。
yum install -y mysql-community-server && echo "mysql5.7.18 install OK."
systemctl start mysqld
systemctl enable mysqld
不过RPM设置密码 的时候比较麻烦,因为是正式版本或者说授权的版本,安全策略的级别是很高的。默认的安全级别是MEDIUM中等的。要求长度最少8位,并且最少有1个大写小写字母数字和符号。
安全策略
mysql> show variables like '%password%';
+---------------------------------------+--------+
| Variable_name | Value |
+---------------------------------------+--------+
| default_password_lifetime | 0 |
| disconnect_on_expired_password | ON |
| log_builtin_as_identified_by_password | OFF |
| mysql_native_password_proxy_users | OFF |
| old_passwords | 0 |
| report_password | |
| sha256_password_proxy_users | OFF |
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 | 长度
| validate_password_mixed_case_count | 1 | 最少有1位大写、小写字母
| validate_password_number_count | 1 | 最少有1位数字
| validate_password_policy | MEDIUM | 密码的安全策略级别
| validate_password_special_char_count | 1 | 最少有1位符号
+---------------------------------------+--------+
//查看安全策略。
0 LOW:最低级,只检查密码长度
1 MEDIUM:中级的,长度,复杂度
2 STRONG:最高级,长度,复杂度,数据字典
mysql> set global validate_password_policy=0; //修改安全策略位LOW
mysql> set global validate_password_length=4; //修改密码的最大长度:
MySQL的启动
1. bin
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
echo "/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &" >> /etc/rc.local
//将这一行内容追加到,rc.local这个文件中,rc.local这个文件会在开机时执行,简单来说就是写到这里的东西开机自启
#/etc/rc.d/rc.local 用于添加开机启动命令
#/etc/rc.local是/etc/rc.d/rc.local的软连接
chmod +x /etc/rc.d/rc.local //要给个执行权限才行,rc.local配置文件中有写。
用 kill 可以关闭mysql服务。
2. rpm
systemctl start mysqld
systemctl enable mysqld
//因为是rpm安装直接启动服务就好了。
默认端口 3306/tcp
netstat -antp | grep mysqld
dba --> mysql(客户端工具) --> mysql-server
mysql-进程 mysqld-进程
进程间通信 mysql.sock 套接字文件
mysql.sock文件一般在tmp目录下租用就是进程间通讯,mysqld是mysql的守护进程,是服务的进程,mysql是数据库的命令进程。这是两个进程,他们之间就是靠mysql.sock进行通信的。
对于系统的基本操作:
show databases; //查看数据库 类似ls
select user(); //查看用户 类似id
select database(); //查看当前所在数据库 类似pwd
mysql> create database db1;
mysql> drop database db1;
mysql> create database db2 default character set utf8 collate utf8_general_ci;
//在创建数据库时指定字符集编码。
当然也可以直接在配置文件 /etc/mycnf中添加下边这两行,重启mysql,就可以默认生效了,创建数据库时不指定位utf8也是utf8。
原来的数据库默认是拉丁文的字符编码。
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
user = mysql
port = 3306
socket = /tmp/mysql.sock
pid-file = /data/mysql/run/mysql.pid
mysql> create database db1;
Query OK, 1 row affected (0.00 sec)
mysql> show create database db1;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> show create database db2;
//查看信息。
Linux中一切都是文件,database也是。
看上边的my.cnf配置文件:
datadir = /data/mysql/data有这样一条。
进到这个目录里
就会发现有自己创建的数据库,是以目录形式存在的。进到这里去,会发现该一个db.opt文件。
[root@localhost gsc1]$ cat db.opt
default-character-set=utf8
default-collation=utf8_general_ci
//这里只有2行,正是数据库的字符集编码。
而且按照配置文件中所说,目录为/data/mysql/data,在这么目录下直接创建目录,然后分配权限,设置属主和属组为mysql,数据库也是能够识别成数据库的。
[root@geili mysql]# pwd
/var/lib/mysql //这个目录rpm包的/etc/my.cnf配置文件中所写的数据库存放位置。
[root@geili mysql]# mkdir db1 //创建目录
[root@geili mysql]# chmod -R 750 db1 //分配权限
[root@geili mysql]# chown -R mysql:mysql db1/ //设置属主和属组。
进入数据库中查看。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
//确实有db1这个数据库。,并且和create database name创建的数据库一样。
数据库中是以表的形式来存储数据的,表在数据库中才可以使用。所以一定要进入某个数据库才能操作表。
进入数据库:
use 数据库名
mysql> create table t1 (id int,name char(10));//创建表要先指定字段。以及字段的数据类型。
mysql> drop table t1; //删除表
musql>show tales;//查看表
mysql> desc t1; //查看某个表的信息。
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
Field 列名
Type 列的数据类型
Null 是否允许是空值
Key 键值
Default 默认值是什么,没有设置的情况下,是空值
Extra 其他的参数
mysql> show create table t1;
| t1 | CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
ENGINE=InnoDB 表的默认的存储引擎
CHARSET=latin1 表的默认的字符集
数据类型:
- 数值型
(1)整型
tinyint 很小整数 127
人的年龄等
smallint 小整数 32767
游戏的等级等
mediumint 中型整数 838607
int 整数 2147483647
bigint 大整数 2^63
游戏的经验等
(2)浮点型
float(M,D) 单精度浮点型 4byte
double(M,D) 双精度浮点型 8byte
M整个数的长度,D小数点后保留几位。
M = D . 是0
M > D M - D = . 前面的整数是几位
- 字符型
(1)
char() 等长字符串
身份证号 电话号码 ...
char(18) char(12)
varchar(255) 可变长字符串
名字 地址 邮箱
(2)
enum() 单选可能的枚举类型
enum("元素1","元素2",..)
人的性别 游戏的职业
set() 多选可能的枚举类型
set("元素1","元素2",...)
(3)
text 保存文本资料
- 时间和日期型
(1)date 日期
1000-01-01 ~ 9999-12-31
账号的注册时间,员工的入职时间,社保的缴纳时间 ...
(2)time 时间
-838:00:00 ~ 838:59:59
(3)datetime
(4)year
两位数:0~ 69 2000 ~ 2069
70 ~ 99 1970 ~ 1999
四位数:1901 ~ 2155
(5)timestamp