MySQL本來是一個開放源代碼的關係數據庫管理系統,原開發者爲瑞典的MySQL AB公司,該公司於2008年被昇陽微系統(Sun Microsystems)收購。2009年,甲骨文公司(Oracle)收購昇陽微系統公司,MySQL成爲Oracle旗下產品。node
MySQL在過去因爲性能高、成本低、可靠性好,已經成爲最流行的開源數據庫,所以被普遍地應用在Internet上的中小型網站中。隨着MySQL的不斷成熟,它也逐漸用於更多大規模網站和應用,好比維基百科、Google和Facebook等網站。很是流行的開源軟件組合LAMP中的「M」指的就是MySQL。mysql
但被甲骨文公司收購後,Oracle大幅調漲MySQL商業版的售價,且甲骨文公司再也不支持另外一個自由軟件項目OpenSolaris的發展,所以致使自由軟件社羣們對於Oracle是否還會持續支持MySQL社羣版(MySQL之中惟一的免費版本)有所隱憂,MySQL的創始人麥克爾·維德紐斯以MySQL爲基礎,成立分支計劃MariaDB。而原先一些使用MySQL的開源軟件逐漸轉向MariaDB或其它的數據庫。例如維基百科已於2013年正式宣佈將從MySQL遷移到MariaDB數據庫[6]。linux
關係數據庫(英語:Relational database),是建立在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。現實世界中的各類實體以及實體之間的各類聯繫均用關係模型來表示。關係模型是由埃德加·科德於1970年首先提出的,並配合「科德十二定律」。現現在雖然對此模型有一些批評意見,但它仍是數據存儲的傳統標準。標準數據查詢語言SQL就是一種基於關係數據庫的語言,這種語言執行對關係數據庫中數據的檢索和操做。算法
關係模型由關係數據結構、關係操做集合、關係完整性約束三部分組成。sql
MySQL是一種使用普遍的數據庫,特性以下:docker
Wrap、Solaris、Windows等多種操做系統。 數據庫
嵌入到其餘的軟件中提供多語言支持,常見的編碼如中文的GB 23十二、BIG5,日文的Shift_JIS等均可以用做數據表名和數據列名編程
與大型數據庫例如Oracle、DB二、SQL Server等相比,MySQL自有它的不足之處,如規模小、功能有限(MySQL Cluster的功能和效率都相對比較差)等,可是這絲毫也沒有減小它受歡迎的程度。對於通常的我的使用者和中小型企業來講,MySQL提供的功能已經綽綽有餘,並且因爲MySQL是開放源碼軟件,所以能夠大大下降整體擁有成本。 目前Internet上流行的網站構架方式是LAMP(Linux+Apache+MySQL+PHP),即便用Linux做爲操做系統,Apache做爲Web服務器,MySQL做爲數據庫,PHP做爲服務器端腳本解釋器。因爲Linux+Apache+MySQL+PHP都是自由或開放源碼軟件(FLOSS),所以使用LAMP不用花一分錢就能夠創建起一個穩定、免費的網站系統。vim
插件式存儲引擎是MySQL數據庫最重要的特性之一,用戶能夠根據應用的須要選擇如何存儲和索引數據庫,是否使用事務等。mySQL默認支持多種存儲引擎,以適應不一樣領域的數據庫應用須要。用戶能夠經過選擇使用不一樣的存儲引擎提升應用的效率,提供靈活的存儲,用戶設置能夠按照本身的須要定製和使用本身的存儲引擎,以實現最大程度的可定製性。
MySQL經常使用的存儲引擎爲MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事務安全表,其餘存儲引擎都是非事務安全表。
MyISAM是MySQL的默認存儲引擎。MyISAM不支持事務、也不支持外鍵,但其訪問速度快,對事務完整性沒有要求。
InnoDB存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是比起MyISAM存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。MySQL支持外鍵存儲引擎只有InnoDB,在建立外鍵的時候,要求附表必須有對應的索引,子表在建立外鍵的時候也會自動建立對應的索引。緩存
主要體如今性能、事務、併發控制、參照完整性、緩存、故障恢復,備份及回存等幾個方面
目前比較普及的存儲引擎是MyISAM和InnoDB,而MyISAM又是絕大部分Web應用的首選。MyISAM與InnoDB的主要的不一樣點在於性能和事務控制上。
MyISAM是早期ISAM(Indexed Sequential Access Method)的擴展實現,ISAM被設計爲適合處理讀頻率遠大於寫頻率的狀況,所以ISAM以及後來的MyISAM都沒有考慮對事物的支持,不須要事務記錄,ISAM的查詢效率至關可觀,並且內存佔用不多。MyISAM在繼承了ISAM優勢的同時,與時俱進的提供了大量實用的新特性和相關工具。例如考慮到併發控制,提供了表級鎖。並且因爲MyISAM是每張表使用各自獨立的存儲文件(MYD數據文件和MYI索引文件),使得備份及恢復十分方便(拷貝覆蓋便可),並且還支持在線恢復。
因此若是應用不須要事務,不支持外鍵,處理的只是基本的CRUD(增刪改查)操做,那麼MyISAM是不二選擇。
# 下載mysql $ wget http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.13-el7-x86_64.tar.gz # 解壓 $ mysql tar -zxvf mysql-8.0.4-rc-linux-glibc2.12-x86_64.tar.gz -C /usr/local # 修改文件夾名稱 $ mv mysql-8.0.4-rc-linux-glibc2.12-x86_64/ mysql 添加默認配置文件 $ vim/etc/my.cnf [client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 user=mysql socket=/tmp/mysql.sock basedir=/usr/local/mysql datadir=/usr/local/mysql/data # 建立mysql組 $ groupadd mysql # 建立mysql用戶 $ useradd -g mysql mysql # 建立mysql數據目錄 $ mkdir $MYSQL_HOME/data # 初始化mysql $ /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ # 初始化報錯 bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory # 解決方法 yum install -y libaio # 初始化報錯 2018-07-08T02:53:24.542370Z 0 [System] [MY-010116] /usr/local/mysql/bin/mysqld (mysqld 8.0.4-rc) starting as process 17745 ... mysqld: Can't create/write to file '/tmp/mysql/data/ibd35qXQ' (Errcode: 13 - Permission denied) 2018-07-08T02:53:24.554816Z 1 [ERROR] [MY-011066] InnoDB: Unable to create temporary file; errno: 13 2018-07-08T02:53:24.554856Z 1 [ERROR] [MY-011066] InnoDB: InnoDB Database creation was aborted with error Generic error. You may need to delete the ibdata1 file before trying to start up again. 2018-07-08T02:53:24.555000Z 0 [ERROR] [MY-010020] Data Dictionary initialization failed. 2018-07-08T02:53:24.555033Z 0 [ERROR] [MY-010119] Aborting 2018-07-08T02:53:24.555919Z 0 [System] [MY-010910] /usr/local/mysql/bin/mysqld: Shutdown complete. # 解決辦法:修改/tmp/mysql的目錄權限 $ chown -R mysql:mysql /tmp/mysql # 初始化成功 > 若是無異常狀況日誌以下能夠看到mysql默認會生成root帳號和密碼root@localhost: /TI(mjVAs1Ta [root@localhost mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 2019-01-29T10:19:34.023997Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.13) initializing of server in progress as process 4240 2019-01-29T10:19:39.764895Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: /TI(mjVAs1Ta 2019-01-29T10:19:43.041419Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.13) initializing of server has completed # 拷貝mysql啓動文件到系統初始化目錄 $ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # 啓動mysql服務器 $ service mysqld start
# 使用mysql客戶端鏈接mysql $ /usr/local/mysql/bin/mysql -u root -p password 修改mysql的默認初始化密碼 > alter user 'root'@'localhost' identified by 'root'; # 建立用戶 CREATE USER '用戶名稱'@'主機名稱' INDENTIFIED BY '用戶密碼' > create user 'jack'@'localhost' identified by 'jack'; # 授予權限 grant 權限 on 數據庫.表 to '用戶名'@'登陸主機' [INDENTIFIED BY '用戶密碼']; > grant replication slave on *.* to 'jack'@'localhost'; # 刷新 # $ flush privileges; # 修改root用戶能夠遠程鏈接 > update mysql.user set host='%' where user='root'; # 查看mysql所用用戶 > select user,host from mysql.user; # docker 修改mysql的最大鏈接數 apt-get update apt-get install vim vim /etc/mysql/mysql.conf.d/mysqld.cnf max_connections=1000 > alter user 'root'@'%' identified with mysql_native_password by 'root';
準備兩臺安裝好的mysql服務器
192.168.79.15 (master)
192.168.79.16 (slave)
# 配置主服務添加以下配置 $ vim /etc/my.cnf # 節點惟一id值 server-id=1 # 開啓二進制日誌 log-bin=mysql-bin # 指定日誌格式 有mixed|row|statement 推薦mixed binlog-format=mixed # 步進值auto_imcrement。通常有n臺主MySQL就填n(可選配置) auto_increment_increment=2 # 起始值。通常填第n臺主MySQL。此時爲第一臺主MySQL(可選配置) auto_increment_offset=1 # 忽略mysql庫(可選配置) binlog-ignore=mysql # 忽略information_schema庫(可選配置) binlog-ignore=information_schema # 要同步的數據庫,默認全部庫(可選配置) replicate-do-db=db1 # slave 節點配置 # 節點惟一id值 server-id=2 # 開啓二進制日誌 log-bin=mysql-bin # 步進值auto_imcrement。通常有n臺主MySQL就填n(可選配置) auto_increment_increment=2 # 起始值。通常填第n臺主MySQL。此時爲第一臺主MySQL(可選配置) auto_increment_offset=2 # 要同步的數據庫,默認全部庫(可選配置) replicate-do-db=db1 # 查看 master 的狀態 , 尤爲是當前的日誌及位置 > show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000004 | 1608 | | | | +------------------+----------+--------------+------------------+-------------------+ # 在slave節點執行以下命令 注意master_log_file 是對應show master status;中file的值,master_log_pos是對應position的值 > change master to master_host='192.168.79.15', master_user='root', master_password='root', master_log_file='mysql-bin.000009', master_log_pos=0; # 啓動 slave 狀態 ( 開始監聽 msater 的變化 ) > start slave; # 查看 slave 的狀態 > show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.79.15 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000009 Read_Master_Log_Pos: 863 Relay_Log_File: node-6-relay-bin.000002 Relay_Log_Pos: 500 Relay_Master_Log_File: mysql-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 863 Relay_Log_Space: 709 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 6291c709-23af-11e9-99fb-000c29071862 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 # 當Slave_IO_Running: Yes和Slave_SQL_Running: Yes都爲yes是說明主從複製正常 #重置 slave 狀態 . $ reset slave; #暫停 slave 狀態 ; $ stop slave;