一、MySQL简介
1、什么是数据库 ?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
主流的数据库有:sqlserver,mysql,Oracle、SQLite、Access、MS SQL Server等,本文主要讲述的是mysql
2、数据库管理系统的优点
1、相互关联的数据的集合 2、较少的数据冗余 3、程序与数据相互独立 4、保证数据的安全、可靠 5、最大限度地保证数据的正确性 6、数据可以并发使用并能同时保证一致性
3、数据库管理系统的基本功能
数据定义 数据处理 数据安全 数据备份
4、数据库管理系统
1、数据库是数据的汇集,它以一定的组织形式存于存储介质上 2、DBMS是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心 3、DBA:负责数据库的规划、设计、协调、维护和管理等工作 4、应用程序指以数据库为基础的应用程序
5、数据库系统的架构
单机架构 大型主机/终端架构 主从式架构(C/S) 分布式架构
6、关系型数据库
1、关系 :关系就是二维表,其中:表中的行、列次序并不重要 2、行row:表中的每一行,又称为一条记录 3、列column:表中的每一列,称为属性,字段 4、主键Primary key:用于惟一确定一个记录的字段 5、域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个值
7、联系的类型
一对一联系(1:1) 一对多联系(1:n) 多对多联系(m:n)
(1)数据的操作:
数据提取:在数据集合中提取感兴趣的内容。SELECT 数据更新:变更数据库中的数据。INSERT、DELETE、UPDATE
(2)数据的约束条件 :是一组完整性规则的集合
实体(行)完整性 Entity integrity 域(列)完整性 Domain Integrity 参考完整性 Referential Integrity
8、简易数据规划流程
第一阶段:收集数据,得到字段
• 收集必要且完整的数据项 • 转换成数据表的字段
第二阶段:把字段分类,归入表,建立表的关联
• 关联:表和表间的关系 • 分割数据表并建立关联的优点 • 节省空间 • 减少输入错误 • 方便数据修改
第三阶段:
• 规范化数据库
9、数据库的正规化分析
1、数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于1970年代初定义了第一范式、第二范式和第三范式的概念
2、RDMBS设计范式基础概念 3、设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,不同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小/2目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般 数据库只需满足第三范式(3NF)即可
10、范式
1NF:无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,确保每一列的原子性。除去同类型的字段,就是无重复的列 说明:第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库 2NF:属性完全依赖于主键,第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分。通常为表加上一个列,以存储各个实例的唯一标识PK,非PK的字段需要与整个PK有直接相关性 3NF:属性不依赖于其它非主属性,满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,非PK的字段间不能有从属关系
二、SQL概念
1、SQL: Structure Query Language
结构化查询语言
SQL解释器:
2、数据存储协议:应用层协议,C/S
S:server, 监听于套接字,接收并处理客户端的应用请求
C:Client
3、客户端程序接口
CLI
GUI
4、应用编程接口
ODBC:Open Database Connectivity
JDBC:Java Data Base Connectivity
5、约束
1、约束:constraint,表中的数据要遵守的限制 2、主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL,一个表只能有一个 3、惟一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表可以存在多个 4、外键:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据 5、检查:字段值在一定范围内
6、基本概念
1、索引:将表中的一个或多个字段中的数据复制一份另存,并且按特定次序排序存储
2、关系运算:
选择:挑选出符合条件的行 投影:挑选出需要的字段 连接:表间字段的关联
7、数据模型
1、数据抽象:
物理层:数据存储格式,即RDBMS在磁盘上如何组织文件 逻辑层:DBA角度,描述存储什么数据,以及数据间存在什么样的关系 视图层:用户角度,描述DB中的部分数据
2、关系模型的分类:
关系模型 基于对象的关系模型 半结构化的关系模型:XML数据
8、MySQL系列
官方网址:
https://www.mysql.com/ http://mariadb.org/ https://www.percona.com
官方文档:
https://dev.mysql.com/doc/ https://mariadb.com/kb/en/ https://www.percona.com/software/mysql-database/percona-server
三、MYSQL的特性
插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是 MYSQL默认引擎 MyISAM ==> Aria InnoDB ==> XtraDB 1、单进程,多线程 2、诸多扩展和新特性 3、提供了较多测试组件 4、开源
四、安装 MYSQL
Mariadb安装方式: 1、源代码:编译安装 2、二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用 3、程序包管理器管理的程序包 CentOS 安装光盘 项目官方:https://downloads.mariadb.org/mariadb/repositories/ 国内镜像:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-x.y.z/yum/centos7-amd64/
centos6安装mysql:
yum install mysql-server
centos6的相关程序:
rpm -ql mysql-server /var/log/mysqld.log 存放日志路径 /usr/libexec/mysqld 服务执行主程序 /etc/rc.d/init.d/mysqld 服务的配置文件
centos7安装mariadb;
yum install mariadb-server
centos7相关程序:
[root@ansiblescripts]#rpm -ql mariadb /usr/libexec/mysqld 服务器执行主程序 /usr/lib/systemd/system/mariadb.service 服务程序 /etc/my.cnf.d/server.cnf 配置文件 /var/lib/mysql 数据库数据存放的路径 /var/log/mariadb/mariadb.log 存放日志路径
centos6启动mysql服务
service mysqld start
五、MySQL操作
1、MySQL数据库
(1)mysql客户端选项
-u 用户 -h 主机地址/主机名 -p 密码 -P 端口(大写字母) -s:静默 -S 套接字位置(指定连接socket文件路径)
-e: 执行SQL命令
例:mysql -u user -p passwd
(2)常见错误如下:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2), it means that the MySQL server daemon (Unix) or service (Windows) is not running.
(3)退出连接:
QUIT 或者 Ctrl+D
(4)-e 选项用法:
[root@ansiblescripts]#mysql -pcentos -e "show databases" 直接输入命令可以查询,不需要进入到mysql里面再输入命令 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+
(5)socket地址
服务器监听的两种socket地址: (1)ip socket: 监听在tcp的3306端口,支持远程通信 (2)unix sock: 监听在sock文件上,仅支持本机通信 如:/var/lib/mysql/mysql.sock) 说明:host为localhost,127.0.0.1时自动使用unix sock
2、查看数据库,创建数据库,使用数据库查看数据库
(1)查看数据库
show databases;
默认(安装自带)数据库:
mysql - 用户权限相关数据 test - 用于用户测试数据 information_schema - MySQL本身架构相关数据
(2)创建数据库:
create database db1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; #utf8编码 create database db1 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; #gbk编码
(3)使用数据库:
use db1;
(4)显示当前使用的数据库中所有表:
SHOW TABLES;
(5)设置数据库密码:
mysql 数据库路径:ls /var/lib/mysql/目录下。
[root@ansiblescripts]#mysql_secure_installation 设置数据库密码的脚本
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y 设置root口令
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y 删除匿名用户账号
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y 禁止远程登录
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y 删除test测试数据库
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y 立即生效当前设置
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
三、用户管理
mysql用户账号由两部分组成:
'USERNAME'@'HOST‘
说明:
1、HOST限制此用户可通过哪些远程主机连接mysql服务器 2、支持使用通配符: % 匹配任意长度的任意字符 172.16.0.0/255.255.0.0 或 172.16.%.% _ 匹配任意单个字符
1、创建用户
create user '用户名'@'IP地址' identified by '密码';
2、删除用户
drop user '用户名'@'IP地址';
3、修改用户
rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';
4、修改密码
set password for '用户名'@'IP地址' = Password('新密码');
注:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
四、mariadb配置
侦听3306/tcp端口可以在绑定有一个或全部接口IP上
vim /etc/my.cnf [mysqld] skip-networking=1(启用)
说明:关闭网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改
1,ON,TRUE意义相同, 0,OFF,FALSE意义相同
五、服务器端配置
服务器端(mysqld):工作特性有多种配置方式
1、命令行选项:
2、配置文件:类ini格式
集中式的配置,能够为mysql的各应用程序提供配置信息
[mysqld] [mysqld_safe] [mysqld_multi] 多实例 [mysql] [mysqldump] [server] [client] 格式:parameter = value
说明:_和- 相同
1,ON,TRUE意义相同, 0,OFF,FALSE意义相同
六、迁移数据库实验:
当根目录的内存不够大时,我们需要将数据库进行迁移,那么,我们该怎么迁移呢?
(1)首先分一个未被使用的分区:
[root@ansible~]#fdisk /dev/sda Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n All primary partitions are in use Adding logical partition 6 First sector (322967552-419430399, default 322967552): Using default value 322967552 Last sector, +sectors or +size{K,M,G} (322967552-419430399, default 419430399): +10G Partition 6 of type Linux and of size 10 GiB is set Command (m for help): t 注意定义逻辑卷类型 Partition number (1-6, default 6): 1 Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks.
(2)将分区进行同步:
[root@ansible~]#partprobe Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only. [root@ansible~]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 100G 0 part / ├─sda3 8:3 0 50G 0 part /data ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 3G 0 part [SWAP] └─sda6 8:6 0 10G 0 part sdb 8:16 0 10G 0 disk └─vg0-testly 253:0 0 64M 0 lvm sdc 8:32 0 10G 0 disk sr0 11:0 1 10G 0 rom
(3)创建LVM卷组:
[root@ansible~]#pvcreate /dev/sda6 创建物理卷组 Physical volume "/dev/sda6" successfully created. [root@ansible~]#vgcreate vg1 /dev/sda6 创建逻辑卷组 Volume group "vg1" successfully created [root@ansible~]#lvcreate -n mysql -l 100%FREE vg1 创建LVM卷组 Logical volume "mysql" created. [root@ansible~]#lvdisplay 查询创建结果 --- Logical volume --- LV Path /dev/vg1/mysql LV Name mysql VG Name vg1 LV UUID zsLEIg-c0Hd-f49l-Hp8f-U9A2-Cele-cWvJoW LV Write Access read/write LV Creation host, time ansible, 2019-11-11 16:44:50 +0800 LV Status available # open 0 LV Size <10.00 GiB Current LE 2559 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1
(4)将当前的/dev/vg1/mysql卷组进行挂载到创建的目录下,最好是写入到/etc/fstab目录下,永久保存:
[root@ansible~]#mkfs.xfs /dev/vg1/mysql meta-data=/dev/vg1/mysql isize=512 agcount=4, agsize=655104 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2620416, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@ansible~]#blkid /dev/sda1: UUID="4357cc0e-6ee7-4a8f-8064-d1a54bdbf17f" TYPE="xfs" /dev/sda2: UUID="38dd5f68-4f30-411c-b80a-0f4a60b06c6f" TYPE="xfs" /dev/sda3: UUID="eb4bf5e6-2645-4b1c-bda8-12c5831b81c2" TYPE="xfs" /dev/sda5: UUID="b8c37e0b-3628-40b6-ac44-c36ca09b448f" TYPE="swap" /dev/sda6: UUID="MScF2N-3cQm-yw6s-vqx2-X0Vp-ySXm-urDZvE" TYPE="LVM2_member" /dev/sdb: UUID="AYecKo-37eD-N6sC-jL33-kCrb-ACAV-ez47oc" TYPE="LVM2_member" /dev/sr0: UUID="2018-11-26-14-22-58-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" /dev/sdc: UUID="JMGIQr-CS6e-XpUb-1MNu-J4fW-faeW-twAMni" TYPE="LVM2_member" /dev/mapper/vg0-testly: UUID="9478f57c-2957-493e-948c-549cc28177bf" TYPE="ext4" /dev/mapper/vg1-mysql: UUID="299553df-ea83-4dab-8c51-b0a57bcd6f9c" TYPE="xfs" [root@ansible~]#mkdir /data/mysql [root@ansible~]#mount /dev/vg1/mysql /data/mysql
(5)修改当前的所属组和所有者权限,与/var/lib/mysql权限一致:
[root@ansibledata]#ll -d /data/mysql /var/lib/mysql drwxr-xr-x 2 root root 6 Nov 11 16:45 /data/mysql drwxr-xr-x 4 mysql mysql 165 Nov 11 15:46 /var/lib/mysql [root@ansibledata]#chown mysql. /data/mysql [root@ansibledata]#ll /data/mysql
(6)迁移数据库数据,在/etc/my.cnf配置文件中修改:
[root@ansibledata]#vim /etc/my.cnf
[mysqld]
#datadir=/var/lib/mysql
datadir=/data/mysql 将迁移的目录写入
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 禁止使用软链接
(7)重启mysql服务器:
[root@ansibledata]#systemctl restart mariadb
(8)查看迁移的数据库数据
[root@ansibledata]#ls /data/mysql aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test