MySQL安装配置 - yiyixiaozhi/readingNotes GitHub Wiki
下载
docker pull mysql:8.0.21
创建mysql相关数据和日志文件夹:
cd /mybtrfs/
mkdir mysql8
cd mysql8 && mkdir data && mkdir files && mkdir log && mkdir config
启动
docker run \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=yyxz \
-v /mybtrfs/mysql8/data:/var/lib/mysql:rw \
-v /mybtrfs/mysql8/files:/var/lib/mysql-files:rw \
-v /mybtrfs/mysql8/log:/var/log/mysql:rw \
-v /mybtrfs/mysql8/config:/etc/mysql:rw \
-v /etc/localtime:/etc/localtime:ro \
--name mysql8 \
--restart=always \
-d mysql:8.0.21
mysql8/data 是数据库文件存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。
mysql8/log 是数据库主生的log。建议挂载到容器外。
mysql8/config 是存放数据库的配置文件。
/etc/localtime:/etc/localtime:ro 是让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
如果启动失败,可以查看最近30分钟日志,方法如下:
docker logs --since 30m mysql8
防火墙放行端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
// 查看放行的端口
firewall-cmd --zone=public --list-ports
登录并创建用户
如果启动没有设置密码,也可以通过配置让首次无密码登录MySQL
[root@xa-yyxz config]# vim /mybtrfs/mysql8/config/my.cnf
[mysqld]
skip-grant-tables
寻找初始化密码
[root@iz2zehxps1f8adfzc3305pz download]# grep 'temporary password' /var/log/mysqld.log
2019-11-11T12:10:26.778076Z 1 [Note] A temporary password is generated for root@localhost: kL4oy!D4yH,?
建立普通用户
# 寻找初始化密码
[root@iz2zehxps1f8adfzc3305pz download]# grep 'temporary password' /var/log/mysqld.log
2019-11-11T12:10:26.778076Z 1 [Note] A temporary password is generated for root@localhost: kL4oy!D4yH,?
# 登录
mysql -h127.0.0.1 -P3306 -uroot -p
# 重置root账号密码
alter user 'root'@'localhost' IDENTIFIED BY 'yyxz';
# 创建用户
## 说明:@后面的ip地址为允许连接的客户端的ip地址,如果改为 '%',就表示客户端没有ip地址的限制。
create user 'yyxz'@'%' identified by 'yyxz';
# 给新用户授权:
## 赋予新用户,从本地操作所有数据库.所有数据表的所有权限
grant all privileges on *.* to 'yyxz'@'127.0.0.1' identified by 'yyxz';
## 赋予新用户,从外部操作所有数据库.所有数据表的所有权限(没有外部客户端的IP限制,但本地有限制)
grant all privileges on *.* to 'yyxz'@'%' identified by 'yyxz';
## 注意:Mysql8授权写法如下:
grant all privileges on *.* to 'yyxz'@'%';
## 只允许访问单个数据库
GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, CREATE VIEW, SHOW VIEW ON `yyxz_slave`.* TO 'yyxz'@'%';
# 刷新权限
FLUSH PRIVILEGES;
# 如果客户端还是无法访问,则修改密码格式。
alter user 'yyxz'@'%' identified with mysql_native_password by 'yyxz';
# 删除用户:
DROP USER user01@%;
DROP USER user01@127.0.0.1;
给root用户授权所有ip都可以访问
mysql> grant all privileges on *.* to 'root'@'%';
mysql> FLUSH PRIVILEGES;
docker下用户和权限配置示例:
# docker restart mysql8
# docker exec -it mysql8 bash
# mysql -uroot -p
Enter password: // 直接回车即可
mysql> use mysql;
mysql> select user,authentication_string from user;
mysql> update user set authentication_string='' where user='root';
# docker restart mysql8
mysql> use mysql;
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'yyxz'; // 此处限制了root只能在本机登录
mysql> flush privileges;
mysql> create user 'yyxz'@'%' identified by 'yyxz';
mysql> alter user 'yyxz'@'%' identified with mysql_native_password by 'yyxz';
mysql> flush privileges;
删除用户和修改密码示例
删除用户
```
mysql> DROP USER weifan;
```
MySQL8修改用户密码
```
mysql> CREATE USER 'yyxz'@'%' IDENTIFIED WITH mysql_native_password BY 'yyxz';
mysql> alter user 'yyxz'@'%' identified with mysql_native_password by 'yyxz';
```
给用户配置数据库相关权限(可选)
mysql> grant all privileges on `ds%`.* to 'yyxz'@'%';
做有限的权限设定
mysql> GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, CREATE VIEW, SHOW VIEW ON `ds%`.* TO 'yyxz'@'%';
mysql> flush privileges;
csv格式数据后快速导入
load data local infile 'D:\\gitRepo\\private\\gitee\\yyxz\\DBDesign\\summaryl.csv' into table `yyxz_test`.`t_bill_summary` fields escaped by '\\' terminated by '\t' lines terminated by '\n' (`id`, `school_id`, `bill_count`, `should_settle_amount`, `refund_amount`, `voucher_refund_amount`, `service_charge_amount`, `order_amount`, `apply_refund_amount`, `source`, `product_tag_amount_detail`, `check_bill_status`, `check_bill_date`, `remark`, `wx_mch_id`, `create_time`, `update_time`)
如果提示错误,则打开下面的开关:
show global variables like 'local_infile';
set global local_infile=1;
主机ip:152 从机ip:225
安装从机
cd /mybtrfs/docker/; mkdir mysql8a; cd mysql8a/; mkdir data; mkdir files; mkdir log; mkdir config;
docker run \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=yyxz \
-v /mybtrfs/mysql8a/data:/var/lib/mysql:rw \
-v /mybtrfs/mysql8a/files:/var/lib/mysql-files:rw \
-v /mybtrfs/mysql8a/log:/var/log/mysql:rw \
-v /mybtrfs/mysql8a/config:/etc/mysql:rw \
-v /etc/localtime:/etc/localtime:ro \
--name mysql8a \
--restart=always \
-d mysql:8.0.21
登录主机,建立server_id,然后建立授权账号
mysql> show variable like "server_id";
mysql> set global server_id 15200;
mysql> CREATE USER 'slave_yyxz'@'%' IDENTIFIED WITH mysql_native_password BY 'yyxz';
mysql> GRANT replication slave ON *.* TO 'slave_yyxz'@'%';
mysql> flush privileges;
备份主机所有数据库:
// 主机上备份数据库
# mysqldump -uroot -pyyxz --all-databases --lock-tables=false > /home/yyxz/download/152db-all.sql
// 拷贝数据库到从机225上
# scp -P 22 /home/yyxz/download/152db-all.sql [email protected]:/home/yyxz/download/152db-all.sql
查看主机152位置:
mysql> show master status;
+------------------+----------+----------------------------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+----------------------------------+------------------+-------------------+
| mysql-bin.000001 | 52905 | yyxz_dev,yyxz_test | | |
+------------------+----------+----------------------------------+------------------+-------------------+
恢复数据到225从机上:
# docker cp /home/yyxz/download/152db-all.sql mysql8a:/home/mysql_dump/
# docker exec -it mysql8a bash
# mysql -uroot -P3306 -pyyxz < /home/mysql_dump/152db-all.sql
// 重启从机的mysql8
docker restart mysql8a
注意:如上指令因为是全量替换,数据恢复到225从机上之后,账号也会被一并替换掉,比如root账号的密码就会被改变。
配置从机的binlog日志读取位置:
mysql> change master to
-> master_host="192.168.1.152",
-> master_user="slave_yyxz",
-> master_password="yyxz",
-> master_port=3306,
-> master_log_file="mysql-bin.000001",
-> master_log_pos=52905;
解锁152主机数据库:
mysql> UNLOCK TABLES;
启动225从机服务
mysql> stop slave;
mysql> start slave;
mysql> show slave status\G;
如果是仅仅针对部分数据库做读写分离,配置示例如下:
文件路径:/etc/my.cnf
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
log-bin=mysql-bin
server-id=1
binlog-do-db=yyxz_dev
binlog-do-db=yyxz_test
如果出现如下错误,有两种解决方式:
1、通过重置master的binlog,然后重置slave来解决
登录master主机数据库
mysql> reset master;
登录slave从机数据库
mysql> show slave status\G;
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'
修复方法:
mysql> stop slave;
// RESET SLAVE ALL清除从库的同步复制信息、包括连接信息和二进制文件名、位置。
mysql> reset slave;
mysql> start slave;
2、跳过个别错误:
mysql> stop slave;
mysql> set global sql_slave_skip_counter=1;
mysql> start slave;
异常处理:
> REMOTE HOST IDENTIFICATION HAS CHANGED! 解决办法
需要删除本机 ~/.ssh/known_hosts文件的192.168.5.1[需要远程的主机IP] 公钥信息
- Docker安装MySQL8
https://www.cnblogs.com/badtree/articles/10130695.html
- 使用Docker搭建MySQL服务