以多张二维表的方式来存储,又给多张表建立了一定的关系(关系型数据库)
nosql很多以json格式进行存储数据的(mongodb)
关系型数据库 | 非关系型数据库 | |
---|---|---|
强大的查询功能 | √ | × |
强一致性 | √ | × |
二级索引 | √ | × |
灵活模式 | × | √ |
扩展性 | × | √ |
性能 | × | √ |
一般初学者不建议源码安装,除非需要定制化,否则使用二进制安装
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.40.tar.gz
tar xzvf mysql-5.6.40.tar.gz
cd mysql-5.6.40
yum install -y ncurses-devel libaio-devel cmake gcc gcc-c++ glibc
useradd mysql -s /sbin/nologin -M
mkdir /application
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \
-DMYSQL_DATADIR=/application/mysql-5.6.40/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.40/tmp/mysql.socket \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
echo $? # 检查上一条代码是否执行成功,为0表示执行成功
make # 编译 -j,指定核数
make install
ln -s /application/mysql-5.6.40/ /application/mysql # 如果版本发生改变,直接重新创建一个软连接,不用修改原来目录的名字
cd /application/mysql/support-files/
cp my-default.cnf /etc/my.cnf # 后者是linux底下自带的mysql文件
cp:是否覆盖"/etc/my.cnf"? y
cp mysql.server /etc/init.d/mysqld
cd /application/mysql/scripts
yum -y install autoconf
./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data/
mkdir /application/mysql/tmp
chown -R mysql:mysql /application/mysql*
/etc/init.d/mysqld start
vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"
source /etc/profile
vim /usr/lib/systemd/system.mysqld.service
[Unit]
Descruption=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=Mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
mysqladin -uroot password '123456'
mysql -uroot -p123456
mysql> show databases;
mysql> \q
Bye
当前运维和开发最常见的做法是二进制安装mysql
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
tar xzvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
useradd mysql -s /sbin/nologin -M
mkdir /application
mv mysql-5.6.40-linux-glibc2.12-x86_64 /application/mysql-5.6.40
ln -s /application/mysql-5.6.40/ /application/mysql # 如果版本发生改变,直接重新创建一个软连接,不用修改原来目录的名字
cp my-default.cnf /etc/my.cnf # 后者是linux底下自带的mysql文件
cp:是否覆盖"/etc/my.cnf"? y
cp mysql.server /etc/init.d/mysqld
cd /application/mysql/scripts
yum -y install autoconf
./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data/
vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"
source /etc/profile
/usr/local
目录下的,我们需要修改配置文件sed -i 's#/usr/local#/application#g' /etc/init.d/mysqld /application/mysqld/bin/mysqld_safe
vim /usr/lib/systemd/system.mysqld.service
[Unit]
Descruption=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
vim /etc/my.cnf
basedir = /application/mysql
datadir = /application/mysql/data
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
mysqladmin -uroot password '123456'
mysql -uroot -p123456
mysql -uroot -p123456 -h127.0.0.1
mysql -uroot -p123456
mysql>
mysql -uroot -p123456 -h127.0.0.1
mysql>status
mysql -uroot -p123456 -hlocalhost
mysql>status
* 套接字连接方式
* mysql -uroot -p123456 -S /tmp/mysql.sock
MySQL的逻辑对象:做为管理人员或者开发人员操作的对象
最直观的数据:二维表,必须用库来存放
mysql逻辑结构与Linux系统对比
MySQL | Linux |
---|---|
库 | 目录 |
show databases; | ls -l / |
use mysql; | cd /mysql |
表 | 文件 |
show tables; | ls |
二维表=元数据+真实数据行 | 文件=文件名+文件属性 |
myisam:
mysql> show create table mysql.user\G;
...
一个表由三个文件组成
innodb:
mysql> show create table test\G;
...
一个表由两个文件组成
mysqladmin -uroot password "123456"
* 忘记root密码
/etc/init.d/mysqld stop
mysqld_safe --skip-grant-tables --skip-networking
# 修改root密码
update mysql.user set password=PASSWORD('123456') where user='root' and host='localhost';
flush privileges;
mysql> create user user01@'192.168.64.%' identified by '123456';
mysql> select user,host from mysql.user;
mysql> drop user user01@'192.168.64.%';
mysql> set password=PASSWORD('123456');
mysql> update mysql.user set password=PASSWORD('USER01') where user='root' and host='localhost';
mysql> grant all privileges on *.* to user01@'192.168.64.%' identified by '123456';
INSERT,SELECT,UPDATE,DELETE,CREATE,DROP,RELOAD,SHUTDOWN,PROCESS,FILE,REFERENCES,INDEX,ALTER,SHOW DATABASE, SUPER, CREATE TEMPORARY TABLES,LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
grant all privileges on *.* to user01@'192.168.64.%' identified by '123456';
权限 作用对象 归属 密码
后面加上with grant options,表示可以当前用户可以给别的用户授权
作用对象分解:
企业中权限的设定
grant select,update,delete,insert on *.* to user01@'192.168.64.%' identified by '123456';
实验思考问题
# 创建wordpress数据库
create database wordpress;
# 使用wordpress库
use wordpress;
# 创建t1、t2表
create table t1 (id int);
create table t2 (id int);
# 创建blog库
create database blog;
# 使用blog库
use blog;
# 创建tb1表
create table tb1 (id int);
授权
1、grant select on *.* to wordpress@'10.0.0.5%' identified by '123';
2、grant insert,delete,update on wordpress.* to wordpress@'10.0.0.5%' identified by '123';
3、grant all on wordpress.t1 to wordpress@'10.0.0.5%' identified by '123';
/etc/init.d/mysqld start -------> mysqld_safe -------> mysqld
/etc/init.d/mysqld stop
mysqladmin -uroot -p123456 shutdown
kill -9 pid ?
killall mysqld ?
pkill mysqld ?
出现问题:
1、如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2、号称可以达到和oracal一样的安全性,但是并不能100%达到
3、在业务繁忙的情况下,丢数据(补救措施,高可用)
--skip-grant-tables
--skip-networking
--datadir=/application/mysql/data
--basedir=/application/mysql
--defaults-file=/etc/my.cnf
--pid-file=/application/mysql/data/db01.pid
--socket=/application/mysql/data/mysql.sock
--user=mysql
--port=3306
--log-error=/application/mysql/data/db01.err
# cmake:
socket=/application/mysql/tmp/mysql.sock
#命令行
--socket=/tmp/mysql.sock
#配置文件:
/etc/my.cnf中[mysqld]标签下:socket=/opt/mysql.sock
#default参数:
mysqld_safe --defaults-file=/tmp/a.txt &配置文件中[mysqld]标签下:socket=/tmp/test.sock
mysqld_safe --defaults-file=666.txt --server_id=888 &
vim /etc/my.cnf
[client]
port=3306
user=root
password=123456
host=192.168.64.129
mysql
一个服务器上会存在多个实例
感觉类似服务器的虚拟主机
# 创建数据目录
mkdir -p /data/330{7..9}
# 创建配置文件
touch /data/330{7..9}/my.cnf
touch /data/330{7..9}/mysql.log
# 编辑3307配置文件
vim /data/3307/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
log-bin=/data/3307/mysql-bin
server_id=7
port=3307
[client]
socket=/data/3307/mysql.sock
# 编辑3308配置文件
vim /data/3308/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
log-bin=/data/3308/mysql-bin
server_id=8
port=3308
[client]
socket=/data/3308/mysql.sock
# 编辑3309配置文件
vim /data/3309/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
log-bin=/data/3309/mysql-bin
server_id=9
port=3309
[client]
socket=/data/3309/mysql.sock
# 初始化3307数据
/application/mysql/scripts/mysql_install_db \
--user=mysql \
--defaults-file=/data/3307/my.cnf \
--basedir=/application/mysql --datadir=/data/3307/data
# 初始化3308数据
/application/mysql/scripts/mysql_install_db \
--user=mysql \
--defaults-file=/data/3308/my.cnf \
--basedir=/application/mysql --datadir=/data/3308/data
# 初始化3309数据
/application/mysql/scripts/mysql_install_db \
--user=mysql \
--defaults-file=/data/3309/my.cnf \
--basedir=/application/mysql --datadir=/data/3309/data
# 修改目录权限
chown -R mysql.mysql /data/330*
# 启动多实例
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
没有开启成功,查看报错日志,重新初始化一下
# 查看server_id
mysql -S /data/3307/mysql.sock -e "show variables like'server_id'"
mysql -S /data/3308/mysql.sock -e "show variables like'server_id'"
mysql -S /data/3309/mysql.sock -e "show variables like'server_id'"
# 进入单独的mysql实例
mysql -S /data/3307/mysql.sock -uroot
# 关闭实例
mysqladmin -S /data/3307/mysql.sock -uroot shutdown
mysqladmin -S /data/3308/mysql.sock -uroot shutdown
mysqladmin -S /data/3309/mysql.sock -uroot shutdown
\h 或 help 或? 查看帮助
\G 格式化查看数据(key:value)
\T 或 tee 记录日志 \T /tmp/temp.log
\c(5.7可用ctrl+c) 结束命令
\s 或 status 查看状态信息
\. 或 source 导入SQL数据
\u 或 use 使用数据库
\q 或 exit 或 quit 退出
\! 或 system 执行shell命令 \! ip a
[root@localhost ~]# mysqladmin -uroot -p1 create hellodb
[root@localhost ~]# mysqladmin -uroot -p1 drop hellodb
[root@localhost ~]# mysqladmin -uroot -p1 ping 检查服务端的状态
[root@localhost ~]# mysqladmin -uroot -p1 status 服务器运行状态
[root@localhost ~]# mysqladmin -uroot -p1 status --sleep 2 --count 10 每两秒钟显示
一次服务器实时状态一共显示10次
uptime:是mysql正常运行的时间
Threads:指开启的会话数
Questions:服务器启动以来客户的问题(查询)数目 (应该是只要跟mysql作交互:不管你查询表,还是查询服务器状态都记问一次)。
Slow queries:按字面意思是慢查询的意思,不知道mysql认为多久才足够算为长查询,这个先放着
Opens:服务器已经打开的数据库的数量
Flush tables:服务器已经执行的flush...、refresh和reload命令的数量。
open tables:通过命令使用的数据库的表的数量,以服务器启动开始。
Queries per second avg:select语句平均查询时间
[root@localhost ~]# mysqladmin -uroot -p1 extended-status 显示状态变量
[root@localhost ~]# mysqladmin -uroot -p1 variables 显示服务器变量
[root@localhost ~]# mysqladmin -uroot -p1 flush-privileges 数据库重读授权表,等同于reload
[root@localhost ~]# mysqladmin -uroot -p1 flush-tables 关闭所有已经打开的表
[root@localhost ~]# mysqladmin -uroot -p1 flush-threads 重置线程池缓存
[root@localhost ~]# mysqladmin -uroot -p1 flush-status 重置大多数服务器状态变量
[root@localhost ~]# mysqladmin -uroot -p1 flush-logs 日志滚动。主要是实现二进制和中继日志滚动
[root@localhost ~]# mysqladmin -uroot -p1 flush-hosts 清除主机内部信息
[root@localhost ~]# mysqladmin -uroot -p1 kill 杀死线程
[root@localhost ~]# mysqladmin -uroot -p1 refresh 相当于同时执行flush-hosts flush-logs
[root@localhost ~]# mysqladmin -uroot -p1 shutdown 关闭服务器进程
[root@localhost ~]# mysqladmin -uroot -p1 version 服务器版本以及当前状态信息
[root@localhost ~]# mysqladmin -uroot -p1 start-slave 启动复制,启动从服务器复制线程
[root@localhost ~]# mysqladmin -uroot -p1 stop-slave 关闭复制线程
[root@localhost ~]# mkdir -p /backup/mysqldump
[root@localhost ~]# mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db
# 备份所有数据库
mysqldump -uroot -p test > /backup/mysqldump/test.db
# 备份指定数据库
mysqldump -uroot -p mysql db event > /backup/mysqldump/table.db
# 备份指定数据库指定表(多个表以空格间隔)
mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.tb
# 备份指定数据库排除某些表
mysqladmin -uroot -p create db_name
mysql -uroot -p db_name < /backup/mysqldump/db_name.db
# 注:在导入数据库前,db_name如果没有,是需要创建的;而且与db_name.db中数据库名是一样的才可以导入。
mysql > use db_name;
mysql > source /backup/mysqldump/db_name.db;
# source也可以还原数据库