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;