数据库第二课

一、回顾数据库安装

数据库官网下载地址 https://downloads.mysql.com/archives/community/

1.源码安装数据库(自定义目录安装)

1)上传或下载代码包
[root@db03 ~]# rz mysql-5.6.46.tar.gz
2)安装依赖
[root@db03 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel
3)解压
[root@db03 ~]# tar xf mysql-5.6.46.tar.gz
4)创建目录
[root@db01 ~]# mkdir /service
5)生成cmake
[root@db03 ~]# cd mysql-5.6.46/
[root@db03 ~]# cmake . -DCMAKE_INSTALL_PREFIX=/service/mysql-5.6.46 \
-DMYSQL_DATADIR=/service/mysql-5.6.46/data \
-DMYSQL_UNIX_ADDR=/service/mysql-5.6.46/tmp/mysql.sock \
-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 \
-DWITH_SSL=system \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0

#程序存放位置
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.38 \
#数据存放位置
-DMYSQL_DATADIR=/application/mysql-5.6.38/data \
#socket文件存放位置
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.38/tmp/mysql.sock \
#使用utf8字符集
-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 \
#启用zlib库支持(zib、gzib相关)
-DWITH_ZLIB=bundled \
#启用SSL库支持(安全套接层)
-DWITH_SSL=bundled \
#启用本地数据导入支持
-DENABLED_LOCAL_INFILE=1 \
#编译嵌入式服务器支持
-DWITH_EMBEDDED_SERVER=1 \
# mysql5.6支持了google的c++mock框架了,允许下载,否则会安装报错。
-DENABLE_DOWNLOADS=1 \
#禁用debug(默认为禁用)
-DWITH_DEBUG=0
#编译
5)编译 make
[root@db03 mysql-5.6.46]# make
6)安装 make install
[root@db03 mysql-5.6.46]# make install
7)做软连接
[root@db02 ~]# ln -s /service/mysql-5.6.46 /service/mysql
8)创建数据库用户
[root@db02 ~]# useradd mysql -s /sbin/nologin -M
9)拷贝配置文件和启动文件
#1.进入配置文件和脚本的目录
[root@db02 ~]# cd /service/mysql/support-files/

#2.拷贝配置文件
[root@db02 support-files]# cp my-default.cnf /etc/my.cnf
10)配置system管理MySQL服务
#1.配置system管理MySQL
[root@db02 ~]# vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=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=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

#2.重新加载启动文件列表
[root@db02 ~]# systemctl daemon-reload
11)初始化数据库
#1.进入初始化目录
[root@db02 support-files]# cd /service/mysql/scripts/

#2.执行初始化命令
[root@db02 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data
12)创建socket文件目录(二进制安装没有)
#先创建tmp目录
[root@db02 ~]# mkdir /service/mysql/tmp
13)授权数据库目录
[root@db02 ~]# chown -R mysql.mysql /service/mysql
[root@db02 ~]# chown -R mysql.mysql /service/mysql-5.6.46
14)system管理启动MySQL
[root@db02 ~]# systemctl start mysql
[root@db02 ~]# ps -ef | grep [m]ysql
mysql     23509      1  3 22:36 ?        00:00:01 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
[root@db02 ~]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      23509/mysqld
15)配置环境变量直接使用mysql
[root@db02 ~]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db02 ~]# source /etc/profile
16)修改root用户密码
[root@db02 ~]# mysql -u root -p			#默认root用户密码为空,有多种方式重置root密码
第一种:
MySQL > SET PASSWORD=PASSWORD('123456');
Query OK, 0 rows affected (0.00 sec)

第二种:
MySQL > grant all privileges on *.* to root@'%' identified by 'oldboy';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

注意:两种重置密码方式有区别。

2.二进制安装(自定义安装目录)

1)上传二进制包
[root@db02 ~]# rz mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
2)安装依赖
[root@db02 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf
3)解压安装包
[root@db02 ~]# tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
4)创建自定义目录
[root@db04 ~]# mkdir /service
5)移动目录并改名
[root@db04 ~]# mv mysql-5.6.46-linux-glibc2.12-x86_64 /service/mysql-5.6.46
6)做软连接
[root@db04 ~]# ln -s /service/mysql-5.6.46 /service/mysql
7)创建数据库用户
[root@db02 ~]# useradd mysql -s /sbin/nologin -M
8)拷贝配置文件和启动文件
#1.进入配置文件和脚本的目录
[root@db04 ~]# cd /service/mysql/support-files/

#2.拷贝配置文件
[root@db04 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y

#3.拷贝启动脚本
[root@db02 support-files]# cp mysql.server /etc/init.d/mysqld
9)初始化数据库
#1.进入初始化目录
[root@db04 support-files]# cd /service/mysql/scripts/

#2.执行初始化命令
[root@db04 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data
10)启动数据库
[root@db04 scripts]# /etc/init.d/mysqld start
/etc/init.d/mysqld: line 244: my_print_defaults: command not found
/etc/init.d/mysqld: line 264: cd: /usr/local/mysql: No such file or directory
Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)
11)如果是二进制安装到自定义目录下需要修改脚本目录
[root@db04 scripts]# sed -i 's#/usr/local#/service#g' /etc/init.d/mysqld /service/mysql/bin/mysqld_safe
12)授权数据库目录
[root@db02 ~]# chown -R mysql.mysql /service/mysql
[root@db02 ~]# chown -R mysql.mysql /service/mysql-5.6.46
13)再次启动
[root@db04 scripts]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/service/mysql/data/db04.err'.
 SUCCESS! 
[root@db04 scripts]#
14)检查进程和端口
[root@db02 scripts]# ps -ef | grep [m]ysql
root      23083      1  0 20:36 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/db02.pid
mysql     23191  23083  0 20:36 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=db02.err --pid-file=/usr/local/mysql/data/db02.pid
[root@db02 scripts]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      23191/mysqld        
[root@db02 scripts]# 
15)配置system管理MySQL服务
#1.配置system管理MySQL
[root@db02 ~]# vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=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=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

#2.重新加载启动文件列表
[root@db02 ~]# systemctl daemon-reload
16)system管理启动mysql
#1.system管理启动MySQL
[root@db02 ~]# systemctl start mysql
[root@db02 ~]# ps -ef | grep [m]ysql

#一定是启动失败的,因为不只有启动脚本里面指定了/usr/local,很多都有
[root@db04 scripts]# grep -r '/usr/local' /service/mysql/*

#怎么办?一个一个修改吗?
17)查看MySQL配置文件检索顺序
[root@localhost mysql]# /service/mysql/bin/mysql --help|grep 'my.cnf'
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
18)配置my.cnf
#1.配置指定数据库安装目录与数据目录
[root@db04 scripts]# vim /etc/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/service/mysql/data

#2.再次启动
[root@db04 scripts]# systemctl start mysql

#3.一定成功
19)配置环境变量直接使用mysql
[root@db02 ~]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db02 ~]# source /etc/profile

3.YUM安装

1)配置MySQL的yum源
[root@db02 ~]# cat /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=0
2)检查存储库是否正确配置
[root@db02 ~]#  yum repolist enabled | grep mysql
3)禁用默认的MySQL模块
[root@db02 ~]# sudo yum module disable mysql
4)安装MySQL
[root@db02 ~]# sudo yum install mysql-community-server
5)启动MySQL
[root@db02 ~]#  sudo service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]
6)检查MySQL运行状态
[root@db02 ~]# sudo service mysqld status
7)保护运行MySQL
[root@db02 ~]# mysql_secure_installation

二、数据库基本操作

1.MySQL设置密码

[root@db04 ~]# mysqladmin -uroot  password '123'

2.使用密码登录

#1.正确登录命令
[root@db04 scripts]# mysql -uroot -p123
[root@db04 scripts]# mysql -u root -p123

#2.错误登录命令
[root@db04 scripts]# mysql -u root -p 123

#3.为什么有这个问题呢
这是我从mysql官方文档拷过来的内容:

for password options, the password value is optional:
  If you use a -p or --password option and specify the password value, there must be no space between -p or --password= and the password following it.
  If you use a -p or --password option but do not specify the password value, the client program prompts you to enter the password. The password is not displayed as you enter it. This is more secure than giving the password on the command line. Other users on your system may be able to see a password specified on the command line by executing a command such as ps auxw. 

具体就是:对于password选项,此选项是可选的
如果你明确指定了-p或者--password的值,那么-p或者--password和密码值之间是不能有空格的。
如果你使用了-p或者--password选项但是没有给出password值,客户端程序提示您输入密码。

For mysql, the first nonoption argument is taken as the name of the default database. If there is no such option, mysql does not select a default database.

对于MySQL,第一个非选项参数被当作默认数据库的名称。如果没有这样的选项,MySQL就不会选择默认数据库。
也就是说在命令行中,你的mysql密码和-p或者--password参数之间有空格,mysql会认为你输入的是登录mysql后自动选择的数据库,而不是你所期望的密码

3.查询用户

[root@db04 scripts]# mysql -uroot -p123

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
|      | db04      |
| root | db04      |
|      | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)

4.删除用户

mysql> drop user root@'::1';
Query OK, 0 rows affected (0.01 sec)

mysql> drop user ''@db04;
Query OK, 0 rows affected (0.00 sec)

mysql> drop user 'root'@db04;
Query OK, 0 rows affected (0.00 sec)

mysql> drop user ''@localhost;
Query OK, 0 rows affected (0.00 sec)

三、企业误删除数据库用户故障解决

1.执行了误删除用户的命令

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)

mysql> delete from mysql.user where 1=1;
Query OK, 2 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
Empty set (0.00 sec)

2.用户删除不重启还是可以登录

#1.删除用户后还是可以登录
[root@db04 ~]# mysql -uroot -p123

#2.重启后不能登录
[root@db04 ~]# systemctl restart mysql

3.解决办法

1)停止数据库
[root@db04 ~]# systemctl stop mysql
2)跳过授权表和网络启动mysql
#1.跳过授权表启动mysql
[root@db04 ~]# mysqld_safe --skip-grant-tables &

这种情况下数据库谁都可以连接,很不安全,所以还有启动跳过网络,只允许本机连接
[root@web02 ~]# mysql -h 10.0.0.7(测试一下果然可以登录上7的mysql)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.46 Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

[root@db04 ~]# mysqladmin shutdown

#2.跳过授权表和网络启动mysql
[root@db04 ~]# mysqld_safe --skip-grant-tables --skip-networking &
3)登录以后创建用户的方式?
#1.登录以后呢?创建用户?(跳过授权表不能创建用户)
mysql> create user root@'localhost';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
4)错误解决方式
#1.切换到mysql数据库
mysql> use mysql;

#2.插入一条用户数据
mysql> insert into user(user,host,password) values('root','localhost',PASSWORD(123));
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
#该表中有的字段必须有默认值

#3.查看表结构
mysql> desc user;

#4.把默认值为空的都加一个空值(这种方式是错误的)
mysql> insert into user(user,host,password,ssl_cipher,x509_issuer,x509_subject) values('root','localhost',PASSWORD('123'),'','','');
Query OK, 1 row affected (0.00 sec)

#5.查看表内容
mysql> select * from user\G
权限全都是N,不能执行任何操作
[root@db04 ~]# mysqladmin shutdown
[root@db04 ~]# systemctl start mysql
[root@db04 ~]# mysql -uroot -p123
mysql> show databases;

mysql> create database oldboy;
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'oldboy'
5)正确解决方式
重启数据库,仍然以跳过授权表检查以及网络连接方式启动。
[root@db04 ~]# mysqld_safe --skip-grant-tables --skip-networking &

#1.切换到mysql数据库
mysql> use mysql;

#2.插入一条用户数据
mysql> delete from mysql.user where 1=1;
Query OK, 2 rows affected (0.00 sec)

mysql> insert into mysql.user values ('localhost','root',PASSWORD('123'),
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'',
'',
'',
'',
0,
0,
0,
0,
'mysql_native_password',
'',
'N');

#3.正常启动测试
[root@db04 ~]# mysqladmin shutdown
[root@db04 ~]# systemctl start mysql
[root@db04 ~]# mysql -uroot -p123
mysql> show databases;

4.另一种解决方式

[root@db04 ~]# mysqld_safe --skip-grant-tables --skip-networking &
mysql> grant all on *.* to root@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问

mysql> select * from user\G

#以上授权方式该用户没有grant权限,必须加上
mysql> grant all on *.* to root@'localhost' identified by '123' with grant option;
Query OK, 0 rows affected (0.00 sec)

#或者update那一条N
mysql> update mysql.user set Grant_priv='Y' where user='root' and host='localhost';

总结:第一种办法用在删除了root用户类似的操作。而update用在你忘记了root密码的情况下更新密码的功能。和上面的文档是有冲突的。估计是不同老师的原因?

回顾linux系统root密码的重置方式
	1.通过单用户模式重置root密码。  init 1  单用户模式    init 3  多用户模式    init 5   图形模式
	2.光盘修复模式。

	
	数据库密码恢复的方式:
	第一种:误删除了root用户的用户信息。
		第一步:停止数据库服务。
		第二步:启动的时候跳过skip-grant-table授权验证表,以及跳过网络模式 skip-netowrking。
		第三步:登入数据库。
		第四步:往mysql.user表内insert  user,host,password数据。
		第五步:重启数据库服务进行正常登陆。
	
	
	第二种:忘记root用户的登陆密码
		第一步:停止数据库。
		第二步:启动的时候跳过skip-grant-table授权表以及跳过网络模式  skip-networking
		第三步:update更新mysql.user表中的root用户的密码信息。
		第四步:重启服务进行正常登陆

四、mysql体系结构管理

1.客户端与服务器模型

1)mysql是一个典型的C/S服务结构
1.mysql自带的客户端程序(/service/mysql/bin)
	mysql
	mysqladmin
	mysqldump

2.mysqld一个二进制程序,后台的守护进程
	单进程
	多线程
2)MySQL的两种连接方式
1.TCP/IP的连接方式
2.套接字连接方式,socket连接

#查看连接方式
mysql> status;
--------------
Connection:		Localhost via UNIX socket

3.举例:
	3.1.TCP/IP连接
	mysql -uroot -p -h127.0.0.1
	mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock
	
	3.2.socket连接
	mysql -uroot -p -hlocalhost
	mysql -uroot -p123(默认连接方式,socket)
	
4.注意:
	4.1.因为使用TCP/IP连接,需要建立三次握手
	4.2.不一定-h都是tcp,-hlocalhost是socket连接

五、mysql服务构成

1.实例

1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。

1.什么是实例?
	一个进程 + 多个线程 + 预分配内存空间
2.多实例?
	多个进程 + 多个线程 + 多个预分配的内存空间

2.mysqld服务器程序构成

mysqld是一个守护进程但是本身不能自主启动
[root@db04 ~]# /etc/init.d/mysqld start
1)连接层
1.验证用户的合法性
2.提供两种连接方式(TCP/IP  socket)
3.建立一个与SQL层交互的线程
2)sql层
1.接收连接层传来的SQL语句
2.验证语法
3.验证语义(DML,DDL,DCL,DQL) 检查你输入的SQL语句是 select insert update delete... grant
4.解析器:解析你的SQL语句,生成多种执行计划
5.优化器:接收解析器传来的多种执行计划,选择最优的一种
6.执行器:将优化器选择出的最优的SQL,执行
	6.1 建立一个与存储引擎层 交互的线程
	6.2 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果
7.如果你的前端有缓存,写缓存
8.记录日志(binlog)
3)存储引擎层
1.接收到SQL层传来的SQL语句
2.与磁盘交互,取数据,结构化成表的形式,返回给SQL层
3.建立一个与SQL层交互的线程

六、mysql的结构

1.MySQL的逻辑结构

#类似于linux命令

1.库
2.表:元数据+真实数据行
3.元数据:列+其它属性(行数+占用空间大小+权限)
4.列:列名字+数据类型+其他约束(非空、唯一、主键、非负数、自增长、默认值)

MySQL逻辑结构与Linux系统对比

MySQLLinux
目录
show databases;ls-l /
use mysqlcd /mysql
文件
show tables;ls
二维表=元数据+真实数据行文件=文件名+文件属性

1.MySQL的物理结构

mysql就是最底层的数据文件,可以手动在data目录下创建目录,在数据库里面可以看到
1)MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。
2)存储引擎分为很多种类(Linux中的FS)
3)不同存储引擎的区别:存储方式、安全性、性能

#注意:开发时,数据库的库名和表名都要小写,因为很多研发使用第三方工具连接数据库,而windows不区分大小写,linux区分大小写,很容易读写错数据库;
	
#可以调整数据库不区分大小写:
mysql> show variables like '%lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)
#可以修改配置文件来让数据库不区分大小写
[root@db04 ~]# vim /etc/my.cnf
[mysqld]
lower_case_table_names=1
[root@db04 ~]# systemctl restart mysql

3.mysql的物理结构单位

1.段:理论上一个表就是一个段,由多个区构成,(分区表是一个分区一个段)
2.区:连续的多个页构成
3.页:最小的数据存储单元,默认是16k
4.分区表:一个区构成一个段就是一个表
	数据源库经常会进行拆分,横向拆分和竖向拆分,逻辑上划分区域,而分区表是将数据页构成的区单独拆出一个表

七、mysql的多实例

NGINX多实例就是多个配置文件
mysql多实例:
	1.多个数据目录
	2.多个端口
	3.多个socket文件
	4.多个日志文件

1.创建多个数据目录

[root@db01 ~]# mkdir /data/{3307,3308,3309} -p

2.准备多个配置文件

[root@db01 data]# vim /data/3307/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
log-error=/data/3307/data/mysql.err
log-bin=/data/3307/data/mysql-bin
server_id=7

-------------------------------------------
	
[root@db01 data]# vim /data/3308/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/data/mysql.err
log-bin=/data/3308/data/mysql-bin
server_id=8

--------------------------------------------

[root@db01 data]# vim /data/3309/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
log-error=/data/3309/data/mysql.err
log-bin=/data/3309/data/mysql-bin
server_id=9

3.初始化多套数据目录(目的就是为/data/3307/data/里面有相关启动数据库的文件)

[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
	
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data

[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data

#使用tree可以查看
[root@db01 scripts]# tree -L 3 /data

4.授权目录

[root@db01 scripts]# chown -R mysql.mysql /data

5.启动数据库

[root@db01 scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &
连接:
[root@web01 ~]# mysql -h 127.0.0.1 -P 3309(注意:要用-h 连接,不然登录的始终是你默认的3306端口)

6.检查启动

[root@db01 scripts]# netstat -lntup|grep 330
tcp6       0      0 :::3307                 :::*                    LISTEN      25550/mysqld        
tcp6       0      0 :::3308                 :::*                    LISTEN      25722/mysqld        
tcp6       0      0 :::3309                 :::*                    LISTEN      25894/mysqld     

7.多实例设置密码

[root@db01 scripts]# mysqladmin -uroot -S /data/3307/mysql.sock password '3307'
[root@db01 scripts]# mysqladmin -uroot -S /data/3308/mysql.sock password '3308'
[root@db01 scripts]# mysqladmin -uroot -S /data/3309/mysql.sock password '3309'

8.多实例验证

[root@db01 scripts]# mysql -uroot -p3307 -S /data/3307/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 7     |
+---------------+-------+
	
[root@db01 scripts]# mysql -uroot -p3308 -S /data/3308/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 8     |
+---------------+-------+
	
[root@db01 scripts]# mysql -uroot -p3309 -S /data/3309/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 9     |
+---------------+-------+

9.连接多实例小技巧

[root@db01 scripts]# vim /usr/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3308
mysql -uroot -p3308 -S /data/3308/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3307
mysql -uroot -p3307 -S /data/3307/mysql.sock
	
[root@db01 scripts]# chmod +x /usr/bin/mysql*
	作业:
	1.将多实例3307,3308 做成3309的从库
	2.画图,mysqld的程序结构
	3.整理今天所有的理论.
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐