mysql8数据库的彻底重建

mysql8数据库的彻底重建

安全的停止数据库

mysqladmin -uroot -p shutdown

删除数据目录下所有的数据

rm -rf /var/lib/mysql/*

然后重启数据库

systemctl restart mysqld

忘记密码,重置密码,参考自己的博客

https://blog.csdn.net/qq_35889860/article/details/105310128

获得基础数据

方法一:(考虑如何全量导出而不锁表)

从主库上全量导出数据库

参考:https://blog.csdn.net/Mr_Yang__/article/details/105976465

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob -uroot -p --master-data=2 -A > master.sql

参数解析

–skip-lock-tables 不锁表
–master-data=2 在导出的时候同时生成binlog文件名和位置在导出的文件开头。这个很重要。因此第4步(show master status)也不需要执行了,binlog的文件和位置可以从这里拿到。
–master-data=1 时 不注释change语句
–single-transaction 通过将导出操作封装在一个事务内来使得导出的数据是一个一致性快照
-–flush-logs 开始导出之前刷新日志请注意:假如一次导出多个数据库(使用选项–databases或者–all-databases),将会逐个数据库刷新日志。除使用–lock-all-tables或者–master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用–lock-all-tables 或者–master-data 和–flush-logs。
–hex-blob 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。

此外,我们不必在master上执行“show master status;”去找主库的pos和logfile了,这两个参数会在导出的sql文件(master.sql)里,大概在前100行。

方法二: (考虑如何全量导出而不锁表)

从主库上做一次全备得到基础数据

获得binlog位置点

对于上面两种全量导出的数据,在导出的时候会有一个日志位置记录点,找到这个位置点并记录

head -n 100 master.sql

在从库中导入前面得到的基础数据

把得到的基础数据传到从库所在机器

scp master.sql 172.16.5.152:/root

mysql -uroot -p < master.sql

// 导入以后,1. mysql root密码会不会被覆盖?2. 如果没有被覆盖,是不是说明mysql库不包含在导出的全备数据中?

答:发现mysql密码并没有变,还是和之前一样,并没有变成主库的mysql root密码。

答:通过导入以后查看mysql库发现,mysql库也包含在导出的全备数据中,只是好像root密码没有被覆盖。其他的用户还未知

在主库创建主从同步使用的账号

//注意权限的范围

INSERT INTOmysql.user(Host,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,Create_tablespace_priv,ssl_type,ssl_cipher,x509_issuer,x509_subject,max_questions,max_updates,max_connections,max_user_connections,plugin,authentication_string,password_expired,password_last_changed,password_lifetime,account_locked) VALUES ('%', 'zhucong', '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', '*1A2066290CD18CD9852F43A67F6ACBE60A3E5086', 'N', '2020-04-29 16:11:39', NULL, 'N');

mysql> use mysql;

mysql> ALTER USER 'zhucong'@'%' IDENTIFIED WITH mysql_native_password BY 'Big##123##@@dd';

设置主从同步

登陆从库,执行: show slave status \G; 查看一下

然后查看从主库拷贝过来的SQL文件(master.sql),会在前100行看到这样一行“CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000003’, MASTER_LOG_POS=154;”,
#这就是master的pos和logfile,也即是下面需要CHANGE MASTER语句中用到的‘MASTER_LOG_FILE’和‘MASTER_LOG_POS’
CHANGE MASTER TO MASTER_HOST='172.16.5.151', \
MASTER_PORT=3306, \
MASTER_USER='zhucong', \
MASTER_PASSWORD='runsdata', \
MASTER_LOG_FILE='mysql-bin.000020', \
MASTER_LOG_POS=155;

最后start slave;

观察结果

从库执行 show slave status \G; 查看一下

最后

设置mysql只读
mysql8要这样设置,这样设置以后,除了主从的超级线程,其他的用户包括root都只能读了。这样可以完全保证从库的不可操作性。如果想要取消这个只读的。可以使用root,重新执行下面语句,把on改成off
set global super_read_only=ON;
flush privileges;

对于mysql5.7好像只要设置下面这个就可以了。(还未验证)
set global read_only=1;
flush privileges;

你可能感兴趣的:(技术研究,技术分享)