實驗環境
master 192.168.132.121 主庫
slave 192.168.132.122 從庫
一 mysql的使用介紹
1.1 mysql單台服務器特點
缺點
單台服務器如果磁盤出現問題的話,數據庫數據就會丟失
單台服務器的備份,如果把數據文件備份到本地的話,難以自動定期備份
單台服務器無法應對高並發的讀,只有單台的話,讀寫都在同一台,數據壓力大
優點
數據不會出現不一致的現象
維護簡單
1.2 mysql單台服務器推薦方法
如果確實只有單台服務器的話,可考慮采用單台服務器 + 雲快照或者雲存儲
1.3 mysql多台服務器實現主從復制特點
主從復制優點
多台服務器實現正常的主從復制后,多台服務器的mysql數據一致,數據丟失可能性小
高並發的讀壓力可以分配到多台服務器上
主從復制缺點
復制出問題或者寫量比較大的時候,數據可能會不一致
主從復制維護比較麻煩
1.4 主從復制原理
mysql主從復制原理 binlog
mysql主從復制依賴於mysql二進制日志文件,主mysql服務器會生成二進制日志文件,傳遞給從服務器執行
mysql從庫同步有兩個進程,一個io進程用來同步binlog,一個sql進程用來執行relaylog(中繼日志)里的數據
目前mysql主從架構還是比較常見的,數據的重要性
1.5 復制步驟
整體上來說,復制有3 個步驟:
(1)master 將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
(2)slave 將master 的binary log events 拷貝到它的中繼日志(relay log);
(3)slave 重放中繼日志中的事件,將改變反映它自己的數據。
1.6 復制架構
Datagaurd 主讀寫,備讀不能寫
1.從服務器作為主服務器的實時數據備份
2.主從服務器實時讀寫分離,從服務器實現負載均衡
3.把多個從服務器根據業務重要性進行拆分訪問
1.7 MySQL 主從復制企業應用場景:
1. 從服務器作為主服務器的實時數據備份
當主服務器出現問題時,我們可以人工或設置自動切換到從服務器繼續提供服務,此時從服務器的數據和宕機時的主數據庫幾乎是一致的。
對於人為地執行drop、delete 等語句刪除數據的情況,從庫的備份功能就沒有用了,因為從服務器也會執行刪除的語句。
2. 主從服務器實時讀寫分離,從服務器實現負載均衡
主從服務器架構可通過程序(Javaweb 等)或代理軟件(mysql‐proxy、mycat 等)實現對用戶(客戶端)的請求讀寫分離,即讓從服務器僅僅處理用戶的select 查詢請求,降低用戶查詢響應時間及讀寫同時在主服務器上帶來的訪問壓力。對於更新的數據(例如update、insert、delete 語句)仍然交給主服務器處理,確保主服務器和從服務器保持實時同步。
3. 把多個從服務器根據業務重要性進行拆分訪問可以把幾個不同的從服務器,根據公司的業務進行拆分。
二 mysql主庫的配置
2.1 先對數據初始化,生成密碼
[root@master ~]# mysqld --initialize --user=mysql
[root@master ~]# grep "password" /var/log/mysqld.log
2019-07-03T15:37:29.068299Z 1 [Note] A temporary password is generated for root@localhost: 0JlLA_qy1V:=
2.2 啟動MySQL
[root@master ~]# systemctl start mysqld
[root@master ~]# netstat -ntlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1053/sshd tcp6 0 0 :::22 :::* LISTEN 1053/sshd tcp6 0 0 :::3306 :::* LISTEN 8263/mysqld
2.3 修改配置
需要新增二進制日志binlog配置
[root@master ~]# vim /etc/my.cnf
[mysqld] bind-address=0.0.0.0 port=3306 datadir=/data/mysql socket=/data/mysql/mysql.sock user=mysql skip-name-resolve slow_query_log=on long_query_time=1 slow_query_log_file=/data/mysql/mysql-slow.log innodb-file-per-table=1 innodb_flush_log_at_trx_commit = 2 log_warnings = 1 connect_timeout = 60 net_read_timeout = 120 performance_schema_max_table_instances = 400 server-id = 1 log-bin=master-bin #開啟二進制日之 log-bin-index = master-bin.index #二進制日志的索引目錄 [mysqld_safe] log-error=/data/mysql/mysqld.log pid-file=/data/mysql/mysqld.pid
server-id #binlog配置需要給mysql服務器設置id用來標識mysql服務器,每個mysql服務器都有不一樣的id。從1開始標識
log-bin #開啟binlog,mysql主服務器都需要開啟
log-bin-index #binlog存放到文件里面,index里面存放着binlog的文件名
2.4 創建數據目錄
[root@master ~]# mkdir -pv /data/mysql
[root@master ~]# chown mysql:mysql /data/mysql/
2.5 重啟服務,並驗證
[root@master ~]# systemctl start mysqld
報錯機排錯,查看日志,錯誤日志如下
2019-07-03T15:08:32.203843Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation. 2019-07-03T15:08:32.203862Z 0 [ERROR] InnoDB: The error means mysqld does not have the access rights to the directory. 2019-07-03T15:08:32.203871Z 0 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions 2019-07-03T15:08:32.203886Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error 2019-07-03T15:08:32.808009Z 0 [ERROR] Plugin 'InnoDB' init function returned error. 2019-07-03T15:08:32.808138Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 2019-07-03T15:08:32.808162Z 0 [ERROR] Failed to initialize builtin plugins. 2019-07-03T15:08:32.808172Z 0 [ERROR] Aborting
顯示是沒有權限,但是已經開啟了/data/mysql的權限
關掉selinux,在啟動,成功,是selinux的問題
[root@master ~]# getenforce Enforcing [root@master ~]# setenforce 0 [root@master ~]# getenforce Permissive [root@master ~]# systemctl start mysqld
驗證啟動
[root@master ~]# netstat -ntlp|grep mysql tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 10165/mysqld
使用密碼不能登陸
[root@master src]# mysql -uroot -h localhost -p0JlLA_qy1V:= mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) #這個socket不在 [root@master src]# ll /data/mysql/ total 122936 -rw-r-----. 1 mysql mysql 56 Jul 3 11:37 auto.cnf -rw-r-----. 1 mysql mysql 419 Jul 3 11:37 ib_buffer_pool -rw-r-----. 1 mysql mysql 12582912 Jul 3 11:37 ibdata1 -rw-r-----. 1 mysql mysql 50331648 Jul 3 11:37 ib_logfile0 -rw-r-----. 1 mysql mysql 50331648 Jul 3 11:37 ib_logfile1 -rw-r-----. 1 mysql mysql 12582912 Jul 3 11:37 ibtmp1 -rw-r-----. 1 mysql mysql 177 Jul 3 11:37 master-bin.000001 -rw-r-----. 1 mysql mysql 154 Jul 3 11:37 master-bin.000002 -rw-r-----. 1 mysql mysql 40 Jul 3 11:37 master-bin.index drwxr-x---. 2 mysql mysql 4096 Jul 3 11:37 mysql -rw-r-----. 1 mysql mysql 350 Jul 3 11:37 mysql-slow.log srwxrwxrwx. 1 mysql mysql 0 Jul 3 11:37 mysql.sock #查看在這里 -rw-------. 1 mysql mysql 6 Jul 3 11:37 mysql.sock.lock drwxr-x---. 2 mysql mysql 8192 Jul 3 11:37 performance_schema drwxr-x---. 2 mysql mysql 8192 Jul 3 11:37 sys [root@master src]# ln -s /data/mysql/mysql.sock #做一個軟連接,成功 mysql.sock mysql.sock.lock [root@master src]# ln -s /data/mysql/mysql.sock /var/lib/mysql/mysql.sock [root@master src]# mysql -uroot -h localhost -p0JlLA_qy1V:=
查看數據庫,提示必須改密碼
mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
修改密碼
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
驗證成功
三 啟動從庫
方式相同
3.1 mysql從庫新增中繼日志relaylog配置
[mysqld] bind-address=0.0.0.0 port=3306 datadir=/data/mysql socket=/data/mysql/mysql.sock user=mysql skip-name-resolve slow_query_log=on long_query_time=1 slow_query_log_file=/data/mysql/mysql-slow.log innodb-file-per-table=1 innodb_flush_log_at_trx_commit = 2 log_warnings = 1 connect_timeout = 60 net_read_timeout = 120 performance_schema_max_table_instances = 400 server-id = 2 relay-log = relay-log relay-log-index = relay-log.index [mysqld_safe] log-error=/data/mysql/mysqld.log pid-file=/data/mysql/mysqld.pid
配置說明
server-id #每台mysql服務器的標識需要不一樣
relay-log #從庫需要開啟relay-log,中繼日志
relay-log-index #relaylog也放到文件里面,index里存放着relaylog的文件名
3.2 啟動mysql從庫
[root@slave ~]# mkdir -pv /data/mysql mkdir: created directory ‘/data’ mkdir: created directory ‘/data/mysql’ [root@slave ~]# chown mysql:mysql /data/mysql [root@slave ~]# getenforce Enforcing [root@slave ~]# setenforce 0 [root@slave ~]# getenforce Permissive [root@slave ~]# mysqld --initialize --user=mysql 2019-07-03T15:56:10.701329Z 0 [Warning] The syntax '--log_warnings/-W' is deprecated and will be removed in a future release. Please use '--log_error_verbosity' instead. 2019-07-03T15:56:10.701519Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2019-07-03T15:56:11.241974Z 0 [Warning] InnoDB: New log files created, LSN=45790 2019-07-03T15:56:11.327038Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2019-07-03T15:56:11.398579Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 141defd2-9dab-11e9-8fe3-000c2963fd11. 2019-07-03T15:56:11.401121Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2019-07-03T15:56:11.426433Z 1 [Note] A temporary password is generated for root@localhost: xJ,RO+8krdGB [root@slave ~]# systemctl start mysqld [root@slave ~]# mysql -u root -pxJ,RO+8krdGB mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) [root@slave ~]# ln -s /data/mysql/mysql.sock /var/lib/mysql/mysql.sock [root@slave ~]# mysql -u root -pxJ,RO+8krdGB mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. ...... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> exit
從庫配置完成
兩台數據庫獨立的,但binlog文件已經有,由於主從還沒有搭建,所以還沒有relaylog
3.3 二進制日志
查看日志狀態
show variables like '%log_bin%';
mysql> show variables like '%log_bin%'; +---------------------------------+------------------------------+ | Variable_name | Value | +---------------------------------+------------------------------+ | log_bin | ON | #開啟狀態 | log_bin_basename | /data/mysql/master-bin | | log_bin_index | /data/mysql/master-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+------------------------------+
[root@master ~]# ll /data/mysql/
master-bin.index記錄的日志名字
[root@master ~]# cat /data/mysql/master-bin.index