MySQL公司虽说被Oracle收购了,但是在Oracle的战略计划中毕竟还是一个独立的子公司,MySQL的开发人员和Oracle的开发人员在一定程度上属于不同体系,即使Oracle高手们想为MySQL的优化贡献一份力都是不可能的,这就导致他们各自为政无法将两者的优点很好的融合起来,这也是这些年MySQL更新速度一直都很慢的一个重要原因。我们可以利用自己的工作经验试想一下:一个大集团收购了一些竞争的小公司,虽然这些小公司名义上已经属于大集团,但是从组织结构上来说还是单独的个体,还在继续做着自己以前的事,只是公司的前缀名称变化了。
虽说MySQL官方提供的MySQL版本已经可以适应我们系统的大多数情况,但是由于业务及架构的特点我们需要一种“优化”过的MySQL,这便衍生出来了一些MySQL“定制”版本即“衍生版MySQL”。
这些衍生版MySQL是基于MySQL开源版本上进行修改及优化,从而产生不同特性的MySQL版本,一些著名的MySQL衍生版诸如:MariaDB,Percona Server,MepSQL,Drizzle,OurDelta等。当然除了衍生版MySQL还有一些第三方的MySQL存储引擎诸如:CascaDB,XtraDB,Maria,Spider For MySQL,TokuDB等等非常多。
MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体.写此文字之时MariaDB最新版本为10.0,是基于官方MySQL5.6版本开发的。
正如其他基于MySQL开发的衍生版一样,MariaDB与MySQL在绝大部分是兼容的,你甚至感觉不出两者的差异,MariaDB版本的更新速度甚至超过了MySQL官方版本更新的速度。这其实跟MariaDB的发起者就是MySQL的创始人有很大的关系,比较都是自己的孩子,有谁会最了解呢?
下面是一些MariaDB的优点:
- Maria 存储引擎
- PBXT 存储引擎
- XtraDB 存储引擎
- FederatedX 存储引擎
- 更快的复制查询处理
- 线程池
- 更少的警告和bug
- 运行速度更快
- 更多的 Extensions (More index parts, new startup options etc)
- 更好的功能测试
- 数据表消除
- 慢查询日志的扩展统计
- 支持对 Unicode 的排序
一、下面以MariaDB为例来说说怎么在CentOS 6.6上编译安装
1、系统环境查看
[root@ZhongH100 ~]# cat /etc/centos-release CentOS release 6.6 (Final) [root@ZhongH100 ~]# getconf LONG_BIT 64 #能确定是CentOS 6.6 x86_64的版本
2、先来给CentOS系统装上两个组包"Development tools" "Server Platform Development"和编译cmake
[root@ZhongH100 ~]# yum groupinstall "Development tools" "Server Platform Development" -y [root@ZhongH100 ~]# cd /tmp/ && wget http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz [root@ZhongH100 tmp]# tar xf cmake-3.2.2.tar.gz [root@ZhongH100 tmp]# cd cmake-3.2.2 [root@ZhongH100 tmp]# ./bootstrap [root@ZhongH100 tmp]# [ "$?" = "0" ] && make && make install && cd ../ && which cmake /usr/local/bin/cmake 如果顺利到这那么cmake就编译安装好了
3、下面来说说MySQL编译安装的一些常见参数
###指定安装文件的安装路径时常用的选项: -DCMAKE_INSTALL_PREFIX=/usr/local/mysql ##指定Mysql编译安装到的路径 -DMYSQL_DATADIR=/data/mysql ##指定Mysql数据存放路径 -DSYSCONFDIR=/etc ##指定MySQL的配置文件路径 ###默认编译的存储引擎包括:csv、myisam、myisammrg和heap。若要安装其它存储引擎,可以使用类似如下编译选项: -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 ###若要明确指定不编译某存储引擎,可以使用类似如下的选项: -DWITHOUT_<ENGINE>_STORAGE_ENGINE=1 ###比如: -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1 ###如若要编译进其它功能,如SSL等,则可使用类似如下选项来实现编译时使用某库或不使用某库: -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 ###其它常用的选项: -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_DEBUG=0 -DENABLE_PROFILING=1
4、开始下载MariaDB 且编译安装 MariaDB官方网站
[root@ZhongH100 tmp]# Username="mysql" [root@ZhongH100 tmp]# for i in `seq 1000 1500`;do [ -z "$(awk -F: '{print$3,$4}' /etc/passwd | grep "$i")" -a -z "$(awk -F: '{print$3}' /etc/group | grep "$i")" ] && UGID=$i && break;done && groupadd -g $UGID $Username && useradd -M -u $UGID -g $UGID -s /sbin/nologin $Username [root@ZhongH100 tmp]# wget https://downloads.mariadb.org/interstitial/mariadb-10.0.19/source/mariadb-10.0.19.tar.gz [root@ZhongH100 tmp]# tar xf mariadb-10.0.19.tar.gz [root@ZhongH100 tmp]# mkdir /data/mysql [root@ZhongH100 tmp]# chown -R mysql.mysql /data/mysql [root@ZhongH100 tmp]# cd mariadb-10.0.19 [root@ZhongH100 tmp]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql \ -DWITH_SSL=system \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_SPHINX_STORAGE_ENGINE=1 \ -DWITH_ARIA_STORAGE_ENGINE=1 \ -DWITH_XTRADB_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_FEDERATEDX_STORAGE_ENGINE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_EMBEDDED_SERVER=1 \ -DWITH_READLINE=1 \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DEXTRA_CHARSETS=all \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci #这里的编译参数根据自己的情况适当增减 [root@ZhongH100 mariadb-10.0.19]# make -j $(awk '/processor/{i++}END{print i}' /proc/cpuinfo) && make install #如果没有出错就表示编译成功了
5、下面来做下启动脚本设置和配置文件的修改
[root@ZhongH100 mariadb-10.0.19]# cd /usr/local/mysql/ [root@ZhongH100 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@ZhongH100 mysql]# chmod +x /etc/rc.d/init.d/mysqld [root@ZhongH100 mysql]# \cp support-files/my-large.cnf /etc/my.cnf [root@ZhongH100 mysql]# sed -i '/query_cache_size/a datadir = /data/mysql' /etc/my.cnf
6、现在可以做sql初始化了
[root@ZhongH100 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/
7、启动mysql
[root@ZhongH100 mysql]# service mysqld start Starting MySQL. [确定] [root@ZhongH100 mysql]# ss -tnlp | grep 3306 LISTEN 0 150 :::3306 :::* users:(("mysqld",42507,21)) #启动成功 3306端口被MariaDB监听了
8、为了日后的使用方便我们还需要来做环境变量
[root@ZhongH100 mysql]# echo "export PATH=/usr/local/mysql/bin:\$PATH" > /etc/profile.d/mariadb10.0.19.sh [root@ZhongH100 mysql]# . /etc/profile.d/mariadb10.0.19.sh
如下图这样就可以直接只要mysql的命令了,也能看见是源码编译的版本,而且还能确认MariaDB的root用户是空密码
9、删除匿名帐户和给root帐户添加密码
MariaDB [(none)]> USE mysql Database changed MariaDB [mysql]> SELECT USER,PASSWORD,HOST FROM user; +------+----------+-----------------------+ | USER | PASSWORD | HOST | +------+----------+-----------------------+ | root | | localhost | | root | | zhongh100.wxjr.com.cn | | root | | 127.0.0.1 | | root | | ::1 | | | | localhost | | | | zhongh100.wxjr.com.cn | +------+----------+-----------------------+ 6 rows in set (0.00 sec) MariaDB [mysql]> update user set password=PASSWORD('lookback') WHERE USER='root'; Query OK, 4 rows affected (0.00 sec) Rows matched: 4 Changed: 4 Warnings: 0 MariaDB [mysql]> DELETE FROM user WHERE User=''; Query OK, 2 rows affected (0.00 sec) MariaDB [mysql]> SELECT USER,PASSWORD,HOST FROM user; +------+-------------------------------------------+-----------------------+ | USER | PASSWORD | HOST | +------+-------------------------------------------+-----------------------+ | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | localhost | | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | zhongh100.wxjr.com.cn | | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | 127.0.0.1 | | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | ::1 | +------+-------------------------------------------+-----------------------+ 4 rows in set (0.00 sec) MariaDB [mysql]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [mysql]>
如下图删除了匿名帐户和root密码设置成功
最后来看看MariaDB的状态
MariaDB [mysql]> status; -------------- mysql Ver 15.1 Distrib 10.0.19-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 6 Current database: mysql Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 10.0.19-MariaDB-log Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /tmp/mysql.sock Uptime: 9 min 56 sec Threads: 1 Questions: 16 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 63 Queries per second avg: 0.026 --------------
二、下面以MariaDB为例来说说怎么在CentOS 6.6 上直接解压MariaDB的二进制源码包使用 由于在实验的时候我用的VMware虚拟机所以在编译安装MariaDB前我做了快照,这里我直接恢复快照,还是使用一个全新的CentOS 6.6 x86_64的系统来演示
1、系统环境查看
[root@ZhongH100 ~]# cat /etc/centos-release CentOS release 6.6 (Final) [root@ZhongH100 ~]# getconf LONG_BIT 64 #能确定是CentOS 6.6 x86_64的版本
2、先来给CentOS系统装上两个组包"Development tools" "Server Platform Development"和添加系统用户等
[root@ZhongH100 ~]# yum groupinstall "Development tools" "Server Platform Development" -y && cd /tmp [root@ZhongH100 tmp]# Username="mysql" [root@ZhongH100 tmp]# for i in `seq 1000 1500`;do [ -z "$(awk -F: '{print$3,$4}' /etc/passwd | grep "$i")" -a -z "$(awk -F: '{print$3}' /etc/group | grep "$i")" ] && UGID=$i && break;done && groupadd -g $UGID $Username && useradd -M -u $UGID -g $UGID -s /sbin/nologin $Username [root@ZhongH100 tmp]# tail -1 /etc/passwd mysql:x:1000:1000::/home/mysql:/sbin/nologin [root@ZhongH100 tmp]# wget https://downloads.mariadb.org/interstitial/mariadb-10.0.19/bintar-linux-x86_64/mariadb-10.0.19-linux-x86_64.tar.gz [root@ZhongH100 tmp]# tar xf mariadb-10.0.19-linux-x86_64.tar.gz -C /usr/local/ [root@ZhongH100 tmp]# ls -l /usr/local/ 总用量 48 drwxr-xr-x. 2 root root 4096 9月 23 2011 bin drwxr-xr-x. 2 root root 4096 9月 23 2011 etc drwxr-xr-x. 2 root root 4096 9月 23 2011 games drwxr-xr-x. 2 root root 4096 9月 23 2011 include drwxr-xr-x. 2 root root 4096 9月 23 2011 lib drwxr-xr-x. 2 root root 4096 9月 23 2011 lib64 drwxr-xr-x. 2 root root 4096 9月 23 2011 libexec drwxr-xr-x 12 root root 4096 5月 23 00:49 mariadb-10.0.19-linux-x86_64 drwxr-xr-x 2 root root 4096 5月 23 00:49 mysql drwxr-xr-x. 2 root root 4096 9月 23 2011 sbin drwxr-xr-x. 5 root root 4096 5月 21 17:39 share drwxr-xr-x. 2 root root 4096 9月 23 2011 src [root@ZhongH100 tmp]# ln -sv /usr/local/mariadb-10.0.19-linux-x86_64/ /usr/local/mysql #这里采取软连接的方式生成了/usr/local/mysql 这样做的好处是以后升级只用换个目录链接下就ok了 "/usr/local/mysql" -> "/usr/local/mariadb-10.0.19-linux-x86_64/" [root@ZhongH100 tmp]# ls -l /usr/local/ 总用量 44 drwxr-xr-x. 2 root root 4096 9月 23 2011 bin drwxr-xr-x. 2 root root 4096 9月 23 2011 etc drwxr-xr-x. 2 root root 4096 9月 23 2011 games drwxr-xr-x. 2 root root 4096 9月 23 2011 include drwxr-xr-x. 2 root root 4096 9月 23 2011 lib drwxr-xr-x. 2 root root 4096 9月 23 2011 lib64 drwxr-xr-x. 2 root root 4096 9月 23 2011 libexec drwxr-xr-x 12 root root 4096 5月 23 00:49 mariadb-10.0.19-linux-x86_64 lrwxrwxrwx 1 root root 40 5月 23 00:53 mysql -> /usr/local/mariadb-10.0.19-linux-x86_64/ drwxr-xr-x. 2 root root 4096 9月 23 2011 sbin drwxr-xr-x. 5 root root 4096 5月 21 17:39 share drwxr-xr-x. 2 root root 4096 9月 23 2011 src
[root@ZhongH100 tmp]# cd /usr/local/mysql/ [root@ZhongH100 mysql]# mkdir /data/mysql [root@ZhongH100 mysql]# cd chown -R mysql.mysql /data/mysql
3、下面来做下启动脚本设置和配置文件的修改
[root@ZhongH100 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@ZhongH100 mysql]# sed -i "s@^basedir=.*@basedir=/usr/local/mysql@" /etc/init.d/mysqld [root@ZhongH100 mysql]# sed -i "s@^datadir=.*@datadir=/data/mysql@" /etc/init.d/mysqld [root@ZhongH100 mysql]# chmod +x /etc/rc.d/init.d/mysqld [root@ZhongH100 mysql]# cat > /etc/my.cnf << EOF [client] port = 3306 socket = /tmp/mysql.sock default-character-set = utf8 [mysql] default-character-set=utf8 [mysqld] port = 3306 socket = /tmp/mysql.sock character-set-server=utf8 basedir = /usr/local/mysql datadir = /data/mysql pid-file = /data/mysql/mysql.pid user = mysql bind-address = 0.0.0.0 server-id = 1 skip-name-resolve #skip-networking back_log = 300 max_connections = 1000 max_connect_errors = 6000 open_files_limit = 65535 table_open_cache = 128 max_allowed_packet = 4M binlog_cache_size = 1M max_heap_table_size = 8M tmp_table_size = 16M read_buffer_size = 2M read_rnd_buffer_size = 8M sort_buffer_size = 8M join_buffer_size = 8M key_buffer_size = 4M thread_cache_size = 8 query_cache_type = 1 query_cache_size = 8M query_cache_limit = 2M ft_min_word_len = 4 log_bin = mysql-bin binlog_format = mixed expire_logs_days = 30 log_error = /data/mysql/mysql-error.log slow_query_log = 1 long_query_time = 1 slow_query_log_file = /data/mysql/mysql-slow.log performance_schema = 0 #lower_case_table_names = 1 skip-external-locking default_storage_engine = InnoDB #default-storage-engine = MyISAM innodb_file_per_table = 1 innodb_open_files = 500 innodb_buffer_pool_size = 64M innodb_write_io_threads = 4 innodb_read_io_threads = 4 innodb_thread_concurrency = 0 innodb_purge_threads = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 32M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 bulk_insert_buffer_size = 8M myisam_sort_buffer_size = 8M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 interactive_timeout = 28800 wait_timeout = 28800 [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M EOF
4、现在可以做sql初始化了
[root@ZhongH100 mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/
5、下面来启动mysql
[root@ZhongH100 mysql]# service mysqld start Starting MySQL. [确定] [root@ZhongH100 mysql]# ss -tnlp | grep 3306 LISTEN 0 300 *:3306 *:* users:(("mysqld",10876,23)) #启动成功 3306端口被MariaDB监听了
6、下面来制作环境变量文件、删除匿名用户、添加root用户密码
[root@ZhongH100 mysql]# echo "export PATH=/usr/local/mysql/bin:\$PATH" > /etc/profile.d/mariadb10.0.19.sh [root@ZhongH100 mysql]# . /etc/profile.d/mariadb10.0.19.sh
MariaDB [(none)]> USE mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [mysql]> SELECT USER,PASSWORD,HOST FROM user; +------+----------+-----------------------+ | USER | PASSWORD | HOST | +------+----------+-----------------------+ | root | | localhost | | root | | zhongh100.wxjr.com.cn | | root | | 127.0.0.1 | | root | | ::1 | | | | localhost | | | | zhongh100.wxjr.com.cn | +------+----------+-----------------------+ 6 rows in set (0.00 sec) MariaDB [mysql]> update user set password=PASSWORD('lookback') WHERE USER='root'; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0 MariaDB [mysql]> DELETE FROM user WHERE User=''; Query OK, 2 rows affected (0.00 sec) MariaDB [mysql]> SELECT USER,PASSWORD,HOST FROM user; +------+-------------------------------------------+-----------------------+ | USER | PASSWORD | HOST | +------+-------------------------------------------+-----------------------+ | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | localhost | | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | zhongh100.wxjr.com.cn | | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | 127.0.0.1 | | root | *153CCFAEAA83407D8DBDBFAA3D17B1A95553E60C | ::1 | +------+-------------------------------------------+-----------------------+ 4 rows in set (0.00 sec) MariaDB [mysql]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [mysql]>
三、MySQL授权、修改MySQL的监听端口
1、确认一下3306是否对外开放
mysql默认状态下是不开放对外访问功能的。查看的办法如下:
netstat -an | grep 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* #LISTEN 从上面可以看出,mysql的3306端口只是监听本地的连接,这样就阻碍了外部IP对该数据库的访问,修改的办法其实很简单, #进入到mysql的配置文件所在目录(/etc/mysql/my.cnf)下,找到文件中的如下内容: bind-address = 127.0.0.1 将bind-address注释掉,或者改成你想要使用的客户端主机IP。 这样mysql的远程访问端口就算开启了,下面还有一个更重要的步骤,就是要给远程用户授权。
2、确认客户端用户是否具有访问权限
为了让访问mysql的客户端的用户有访问权限,我们可以通过如下方式为用户进行授权:
MariaDB [mysql]> USE mysql MariaDB [mysql]> grant all on *.* to user_name@"%" identified by "user_password"; MariaDB [mysql]> FLUSH PRIVILEGES; #把user_name和user_password改成对应的用户名和密码
完成上面的步骤,重启mysql即可在远程登陆mysql服务器了。
3、修改MySQL的监听端口
有时候为了安全起见我们不使用MySQL默认的3306端口,尤其是开了外网访问权限的时候,修改方法如下
[root@ZhongH100 ~]# /usr/sbin/setenforce 0 [root@ZhongH100 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/' /etc/sysconfig/selinux [root@ZhongH100 ~]# sed -ri 's/^SELINUXTYPE=.*/#&/' /etc/sysconfig/selinux [root@ZhongH100 ~]# sed -ri 's/^(port).*/\1 = 13306/' /etc/my.cnf #这里将简体端口改成了13306了
然后启动mysql
[root@ZhongH100 ~]# service mysqld start Starting MySQL. [确定] [root@ZhongH100 ~]# ss -tnlp | grep mysqld LISTEN 0 300 *:13306 *:* users:(("mysqld",11670,23)) [root@ZhongH100 ~]#
来自外部的引用: 1