MySQL多实例

MySQL多实例

什么是实例?

一个进程+多个线程+预分配的内存结构

什么是多实例?

多个进程+多个线程+多个预分配的内存结构

多个配置文件:

  • 端口号
  • binlog
  • datadir
  • socket文件
  • 错误日志
  • pid文件
# 1.创建配置文件存放目录
[root@db01 ~]# mkdir /data/{3307,3308,3309} -p
# 2.准备不同的配置文件
【:%s#8#9#g】这个改的快
    
[root@db01 ~]# vim /data/3307/my.cnf
[mysqld]
port = 3307
log-bin = mysql-bin
server_id = 7
datadir = /data/3307/data
basedir = /application/mysql
socket = /data/3307/data/mysql.sock
log_error = /data/3307/data/error.log
pid_file = /data/3307/data/mysql.pid

---------------------------------------------
[root@db01 ~]# vim /data/3308/my.cnf

[mysqld]
port = 3308
log-bin = mysql-bin
server_id = 8
datadir = /data/3308/data
basedir = /application/mysql
socket = /data/3308/data/mysql.sock
log_error = /data/3308/data/error.log
pid_file = /data/3308/data/mysql.pid

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

[root@db01 ~]# vim /data/3309/my.cnf

[mysqld]
port = 3309
log-bin = mysql-bin
server_id = 9
datadir = /data/3309/data
basedir = /application/mysql
socket = /data/3309/data/mysql.sock
log_error = /data/3309/data/error.log
pid_file = /data/3309/data/mysql.pid

# 3.初始化出不同的datadir
[root@db01 ~]# cd /application/mysql/scripts/
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3307/data

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

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

# 4.启动
[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 &

`反复起的时候记得删除data下的文件
[root@db01 /data/3307]# rm -rf /data/* 

# 停服务
[root@db01 scripts]# mysqladmin -S /data/3307/data/mysql.sock shutdown
[root@db01 scripts]# mysqladmin -S /data/3308/data/mysql.sock shutdown
[root@db01 scripts]# mysqladmin -S /data/3309/data/mysql.sock shutdown


# 5.检查端口
[root@db01 scripts]# netstat -lntup
tcp6       0      0 :::3306                 :::*                    LISTEN      50821/mysqld        
tcp6       0      0 :::3307                 :::*                    LISTEN      51145/mysqld        
tcp6       0      0 :::3308                 :::*                    LISTEN      51674/mysqld        
tcp6       0      0 :::3309                 :::*                    LISTEN      51856/mysqld      

# 6.连接
[root@db01 scripts]# mysql -S /data/3307/data/mysql.sock
[root@db01 scripts]# mysql -S /data/3308/data/mysql.sock
[root@db01 scripts]# mysql -S /data/3309/data/mysql.sock

# 7.测试
[root@db01 scripts]# mysql -S /data/3307/data/mysql.sock -e 'show variables like "server_id";'
[root@db01 scripts]# mysql -S /data/3308/data/mysql.sock -e 'show variables like "server_id";'
[root@db01 scripts]# mysql -S /data/3309/data/mysql.sock -e 'show variables like "server_id";'

# 8.编写连接脚本
[root@db01 scripts]# vim /usr/local/bin/mysql3307
mysql -S /data/3307/data/mysql.sock

[root@db01 scripts]# vim /usr/local/bin/mysql3308
mysql -S /data/3308/data/mysql.sock

[root@db01 scripts]# vim /usr/local/bin/mysql3309
mysql -S /data/3309/data/mysql.sock

`要使用该脚本必须授权
[root@db01 scripts]# chmod a+x  /usr/local/bin/mysql3307
[root@db01 scripts]# chmod a+x  /usr/local/bin/mysql3308
[root@db01 scripts]# chmod a+x  /usr/local/bin/mysql3309

# 9.编写启动脚本
[root@db01 ~]# cd /usr/lib/systemd/system
[root@db01 system]# vim mysql3309.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=/application/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000

----------------------------------------------------
[root@db01 system]# vim mysql3307.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=/application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000

-------------------------------------------------------
[root@db01 system]# vim mysql3308.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=/application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
`之前用什么启动的 就用什么杀死 然后再重新启动杀死就用一种就可以了

MySQL的用户管理

Linux用户管理 MySQL用户管理
创建用户:useradd 或者adduser -p create user root@'%'; create user root@'%' identified by '123';
设置密码:passwd username grant all on *.* to root@'%' identified by '123';
删除用户:userdel drop user root@'::1'
delete from mysql.user where user='root' and host='::1';
修改用户:usermod update,grant,alter

补充一下创建用户 useradd 和adduser

都是创建用户 只不过adduser是创建了一个指向useradd的软链接

数据库帮助

[root@db02 ~]# mysqladmin variables     

库外执行,查看数据库

[root@db01 /application/mysql/scripts]# mysql -S /data/3307/data/mysql.sock -e 'show variables like "server_id";'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 7     |
+---------------+-------+

创建用户

mysql> create user oldboy@'10.0.0.%' identified by '123';

查看所有用户

mysql> select user,host from mysql.user;  `查看MySQL中所有用户

删除用户

mysql> drop user root@'db01';
mysql> drop user root@'::1';
mysql> drop user ''@'db01';
mysql> drop user ''@'localhost';
mysql> drop user root@'localhost';
mysql> drop user root@'127.0.0.1';
mysql> truncate mysql.user;   全删  忘记它!


[root@db02 ~]# mysql
mysql> select user,host from mysql.user;  `查看MySQL中所有用户
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | 127.0.0.1 |
| root | ::1       |
|      | db02      |
| root | db02      |
|      | localhost |
| root | localhost |
+------+-----------+
7 rows in set (0.04 sec)

mysql> drop user root@'::1';**  `删除用户

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

MySQL用户定义

用户名@'主机域'
root@'localhost'
root@'%'
root@'10.0.0.%'
root@'10.0.%.%'
root@'10.%.%.%'
root@'10.0.0.5%' 范围:50~59 '5'
root@'10.0.0.0/255.255.255.0'

MySQL修改root密码的方式

1.grant

mysql> grant all on *.* to root@'localhost' identified by '123';
`grant改密码  5.6版本没有用户的情况下可以直接创建  5.7不行,会报错,必须先创建用户在设置密码

2.mysqladmin

`新建立的数据库默认管理员帐号是没有密码,任何人都可以连接
# mysqladmin -u root password "123"    --把root用户登录密码改为123
# mysqladmin -u root password 'newpasswd' -p123    --有密码后,再使用这个命令改密码,就需要原密码

3.update

mysql> update mysql.user set password=PASSWORD("1") where user="root" and host='localhost';

或者
mysql> use mysql;
mysql> update user set password=password(123) where user='root' and host='localhost';    
mysql> flush privileges;    --修改过密码后都要记得刷新权限表

4.set

#修改当前登录的用户密码
mysql> set password=PASSWORD('123');
mysql> set password for 'root'@'localhost'=password('123'); --使用此操作语句也可以修改密码,修改后不需要刷新权限表

生产案例

1.误删除所有用户

`方法一:
# 1.停止数据库
[root@db02 ~]# systemctl stop mysqld

# 2.跳过授权表,跳过网络,启动MySQL
[root@db02 ~]# mysqld_safe --skip-grant-tables --skip-networking(加上这个比较安全只能用socket连接 不加所有人都能连接到你的数据库 不需要密码) &

# 3.往表里插数据
[root@db02 ~]# mysql
mysql> insert into mysql.user(user,host,password) values('root','localhost',PASSWORD('123'));
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

mysql>  insert into mysql.user(user,host,password,ssl_cipher,x509_issuer,x509_subject) values('root','localhost',PASSWORD(('123'),'','','');

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');

# 4.重启数据库
[root@db02 ~]# /etc/init.d/mysqld restart

# 5.连接数据库
[root@db02 ~]# mysql -uroot -p123
`方法二:
# 1.停库
[root@db02 ~]# /etc/init.d/mysqld stop

# 2.跳过授权表,跳过网络,启动MySQL
[root@db02 ~]# mysqld_safe --skip-grant-tables --skip-networking &

# 3.刷新授权表
mysql> flush privileges;

# 4.直接创建用户 并授权 给密码
mysql> grant all on *.* to root@'localhost' identified by '123' with grant option;

# 5.重启数据库
[root@db02 ~]# /etc/init.d/mysqld restart

# 6.连接数据库
[root@db02 ~]# mysql -uroot -p123
mysql> show databases; `查看表
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.32 sec)

mysql> select * from mysql.user\G `查看权限  一路Y
Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
                 ...

当不小心把所有用户删掉的时候 你自己登陆的那个root用户还是可以登陆的

mysql> flush privileges; 执行这个命令后 重启mysql 就什么都进不去了 把自己锁在门外了

这样杀掉进程 就可以用第二种方式解决了

但是!!!!这样有时候会数据库宕机 最好不要用

[root@db01 /application/mysql/data]# rm -f db01.err 

[root@db01 /application/mysql/data]# ps -aux |grep mysql
root       3284  0.0  0.0 113304   336 ?        S    11:23   0:00 /bin/sh /application/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking
mysql      3396  0.0 22.0 1300008 451436 ?      Sl   11:23   0:10 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=db01.err --pid-file=db01.pid
root       5220  0.0  0.0 112704   972 pts/2    R+   15:24   0:00 grep --color=auto mysql

[root@db01 /application/mysql/data]# pkill mysql

[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &

[root@db01 ~]# mysql
mysql> 

2.忘记root密码

# 1.停止MySQL
[root@db01 ~]# systemctl stop mysqld

# 2.跳过授权表,跳过网络,启动MySQL
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &

当是3307时
[root@db01 ~]# mysqld_safe --defaults-file=/data/3307/my.cnf --skip-grant-tables --skip-networking &
#这个语句顺序要注意  不然会报错已经存在 把defaults放前面


# 3.修改密码
mysql> update mysql.user set password=PASSWORD('1') where user='root' and host='localhost';

# 4.刷新系统授权表
mysql> flush privileges;

# 5.重启数据库
[root@db01 ~]# /etc/init.d/mysqld restart
posted @ 2019-11-27 16:22  干瘪的柠檬  阅读(124)  评论(0)    收藏  举报