mysqldba深度学习笔记


美河学习在线 www.eimhe.com 192.168.0.24 密码 root devOracle2014 mysql root 密码:root 192.168.0.39 root devOracle2014 mysql root 密码:root 192.168.0.20 : root devDb2013 mysql root 密码:root 1、 下载安装 1、下载 Mysql 的 msi、zip 的区别: http://dev.mysql.com/doc/refman/5.6/en/windows-choosing-package.html zip 压缩文件免安装,msi 文件需要安装。 MD5: 503dc2840c6732ae3e5dc80a3022f1a7 Size: 47.3M 美河学习在线 www.eimhe.com MD5: 08028c89f892534114550c75f57f3453 Size: 342.9M MD5: 26712fd49793d858e337296d55872e55 Size: 248.2M 2、windows 下安装 1、安装 5.6 http://jingyan.baidu.com/article/597035521d5de28fc00740e6.html http://jingyan.baidu.com/article/f79b7cb3a25e759144023ee7.html 5.0 http://jingyan.baidu.com/article/f79b7cb35c0f439144023e38.html http://bbs.csdn.net/topics/390650882 美河学习在线 www.eimhe.com http://www.cnblogs.com/zwaleaf/archive/2013/03/16/2963738.html http://blog.csdn.net/heizistudio/article/details/9916093 http://blog.csdn.net/cciii/article/details/13276351 http://blog.csdn.net/mhmyqn/article/details/17043921 不需要 my.ini 文件也可以 2、win7 下彻底卸载 mysql Mysql 完全卸载方法(Windows 7) 1. 卸载 Mysql 之前,先关闭 Mysql 服务 2. 进入控制面板中卸载程序(或者使用其它软件卸载) 3. 卸载完成后,再次进入到 C:\Program Files 和 C:\ProgramData 下将 mysql 文件删除干净, 找到其他目录下的 mysql 需要删除。 4. 再次在运行中输入 regedit,进入注册表,将其所有的 MYsql 服务完全清除便于下次安装 能够完全成功: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL 目录删 除; HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL 目录删 除; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL 目录 删除; 如下图所示: 美河学习在线 www.eimhe.com 注:其中在删除 C:\ProgramData 文件下的 Mysql 文件时,如下图找出: 美河学习在线 www.eimhe.com 将隐藏文件显示出来后,再次删除。 以上操作完成后,要重启电脑;再次进行安装! 3、linux 下 rpm 安装方式 1、方法 1-rpm 安装 1、检查是否已安装,grep 的-i 选项表示匹配时忽略大小写 [root@localhost JavaEE]#rpm -qa|grep -i mysql mysql-libs-5.1.61-4.el6.x86_64 美河学习在线 www.eimhe.com 可见已经安装了库文件,应该先卸载,不然会出现覆盖错误。注意卸载时使用了--nodeps 选项,忽略了依赖关系: [root@localhost JavaEE]#rpm -e mysql-libs-5.1.61-4.el6.x86_64 --nodeps 2、安装 MySQL 的服务器端软件,注意切换到 root 用户: [root@localhost JavaEE]#rpm -ivh MySQL-server-5.5.29-2.el6.x86_64.rpm [root@dbserver mysql]# rpm -ivh MySQL-server-5.6.10-1.rhel5.x86_64.rpm Preparing... ########################################### [100%] 1:MySQL-server ########################################### [100%] 2015-03-16 21:27:02 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-16 21:27:02 2555 [Note] InnoDB: The InnoDB memory heap is disabled 2015-03-16 21:27:02 2555 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2015-03-16 21:27:02 2555 [Note] InnoDB: Compressed tables use zlib 1.2.3 2015-03-16 21:27:02 2555 [Note] InnoDB: CPU does not support crc32 instructions 2015-03-16 21:27:02 2555 [Note] InnoDB: Using Linux native AIO 2015-03-16 21:27:02 2555 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2015-03-16 21:27:02 2555 [Note] InnoDB: Completed initialization of buffer pool 2015-03-16 21:27:02 2555 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! 2015-03-16 21:27:02 2555 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB 2015-03-16 21:27:02 2555 [Note] InnoDB: Database physically writes the file full: wait... 2015-03-16 21:27:02 2555 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB 美河学习在线 www.eimhe.com 2015-03-16 21:27:04 2555 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB 2015-03-16 21:27:05 2555 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0 2015-03-16 21:27:05 2555 [Warning] InnoDB: New log files created, LSN=45781 2015-03-16 21:27:05 2555 [Note] InnoDB: Doublewrite buffer not found: creating new 2015-03-16 21:27:06 2555 [Note] InnoDB: Doublewrite buffer created 2015-03-16 21:27:06 2555 [Note] InnoDB: 128 rollback segment(s) are active. 2015-03-16 21:27:06 2555 [Warning] InnoDB: Creating foreign key constraint system tables. 2015-03-16 21:27:06 2555 [Note] InnoDB: Foreign key constraint system tables created 2015-03-16 21:27:06 2555 [Note] InnoDB: Creating tablespace and datafile system tables. 2015-03-16 21:27:06 2555 [Note] InnoDB: Tablespace and datafile system tables created. 2015-03-16 21:27:06 2555 [Note] InnoDB: Waiting for purge to start 2015-03-16 21:27:06 2555 [Note] InnoDB: 1.2.10 started; log sequence number 0 A random root password has been set. You will find it in '/root/.mysql_secret'. 2015-03-16 21:27:06 2555 [Note] Binlog end 2015-03-16 21:27:06 2555 [Note] InnoDB: FTS optimize thread exiting. 2015-03-16 21:27:06 2555 [Note] InnoDB: Starting shutdown... 2015-03-16 21:27:07 2555 [Note] InnoDB: Shutdown completed; log sequence number 1625977 2015-03-16 21:27:07 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-16 21:27:07 2578 [Note] InnoDB: The InnoDB memory heap is disabled 美河学习在线 www.eimhe.com 2015-03-16 21:27:07 2578 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2015-03-16 21:27:07 2578 [Note] InnoDB: Compressed tables use zlib 1.2.3 2015-03-16 21:27:07 2578 [Note] InnoDB: CPU does not support crc32 instructions 2015-03-16 21:27:07 2578 [Note] InnoDB: Using Linux native AIO 2015-03-16 21:27:07 2578 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2015-03-16 21:27:08 2578 [Note] InnoDB: Completed initialization of buffer pool 2015-03-16 21:27:08 2578 [Note] InnoDB: Highest supported file format is Barracuda. 2015-03-16 21:27:08 2578 [Note] InnoDB: 128 rollback segment(s) are active. 2015-03-16 21:27:08 2578 [Note] InnoDB: Waiting for purge to start 2015-03-16 21:27:08 2578 [Note] InnoDB: 1.2.10 started; log sequence number 1625977 2015-03-16 21:27:08 2578 [Note] Binlog end 2015-03-16 21:27:08 2578 [Note] InnoDB: FTS optimize thread exiting. 2015-03-16 21:27:08 2578 [Note] InnoDB: Starting shutdown... 2015-03-16 21:27:09 2578 [Note] InnoDB: Shutdown completed; log sequence number 1625987 A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER ! You will find that password in '/root/.mysql_secret'. You must change that password on your first connect, no other statement but 'SET PASSWORD' will be accepted. See the manual for the semantics of the 'password expired' flag. Also, the account for the anonymous user has been removed. In addition, you can run: /usr/bin/mysql_secure_installation 美河学习在线 www.eimhe.com which will also give you the option of removing the test database. This is strongly recommended for production servers. See the manual for more instructions. Please report any problems with the /usr/bin/mysqlbug script! The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com New default config file was created as /usr/my.cnf and will be used by default by the server when you start it. You may edit this file to change server settings 安装完成后,安装进程会在 Linux 中添加一个 mysql 组,以及属于 mysql 组的用户 mysql。可通过 id 命令查看: [root@localhost JavaEE]#id mysql uid=496(mysql)gid=493(mysql) groups=493(mysql) MySQL 服务器安装之后虽然配置了相关文件,但并没有自动启动 mysqld 服务,需自行启 动: [root@localhost JavaEE]#service mysql start Starting MySQL.. SUCCESS! 可通过检查端口是否开启来查看 MySQL 是否正常启动: [root@localhost JavaEE]#netstat -anp|grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 34693/mysqld 3、安装 MySQL 的客户端软件: 美河学习在线 www.eimhe.com [root@localhost JavaEE]#rpm -ivh MySQL-client-5.5.29-2.el6.x86_64.rpm 如果安装成功应该可以运行 mysql 命令,注意必须是 mysqld 服务以及开启: [root@localhost JavaEE]#mysql Welcome to the MySQLmonitor. Commands end with ; or \g. Your MySQL connection idis 1 Server version: 5.5.29MySQL Community Server (GPL) Copyright (c) 2000, 2012,Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademarkof Oracle Corporation and/or its affiliates. Other names may be trademarks oftheir respective owners. Type 'help;' or '\h' forhelp. Type '\c' to clear the current input statement. mysql> 4、RPM 安装方式文件分布 Directory Contents of Directory /usr/bin Client programs and scripts /usr/sbin The mysqld server /var/lib/mysql Log files, databases /usr/share/info Manual in Info format /usr/share/man Unix manual pages /usr/include/mysql Include (header) files /usr/lib/mysql Libraries /usr/share/mysql Miscellaneous support files, including error messages, character set files, sample configuration files, SQL for database installation /usr/share/sql- bench Benchmarks 美河学习在线 www.eimhe.com 4、linux 下源码编译安装 1、安装依赖的包 安装依赖的包,挂载光盘在光盘里面是有 rpm –ivh 安装,或者使用 yum 安装。mysql5.5 以 后是通过 cmake 来编译的,需要安装 cmake,可以 yum 安装,也可以编译安装。 编译安装 cmake: [root@ rbdb-cs local]#tar -zxvf cmake-2.8.7.tar.gz [root@ rbdb-cs local]#cd cmake-2.8.7 [root@ rbdb-cs cmake-2.8.7]#./configure [root@rbdb-cs cmake-2.8.7]# make && make install 如果报错了,可以重新 configure,然后执行 make && make install # 安装相关组件: yum -y install yum-fastestmirror yum -y install patch make flex bison tar yum -y install libtool libtool-libs kernel-devel yum -y install libjpeg libjpeg-devel libpng libpng-devel yum -y install libtiff libtiff-devel gettext gettext-devel yum -y install libxml2 libxml2-devel zlib-devel net-snmp yum -y install file glib2 glib2-devel bzip2 diff* openldap-devel yum -y install bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs yum -y install e2fsprogs-devel krb5 krb5-devel libidn libidn-devel yum -y install openssl openssl-devel vim-minimal unzip 或者 shell>yum install cmake --(mysql5.5 以后是通过 cmake 来编译的) shell>yum install ncurses-devel --Redhat 执行 cmake 是需要依赖的包,如缺少编译报错 shell>yum install bison-devel shell>yum install libaio-devel shell>yum install gcc-c++ 或者 yum -y install gcc gcc-c++ gcc-g77 autoconf automake zlib* fiex* libxml* ncurses- 美河学习在线 www.eimhe.com devel libmcrypt* libtool-ltdl-devel* make cmake 或者 yum -y install gcc gcc-c++ autoconf bison libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2- devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn- devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap- servers 2、创建安装用户 mysql [root@csdb24 ~]# groupadd mysql [root@csdb24 ~]# useradd -g mysql mysql [root@csdb24 ~]# id mysql uid=502(mysql) gid=504(mysql) 组=504(mysql) 3、创建目录-修改权限 //安装 mysql [root@csdb24 local]# mkdir -p /usr/local/mysql //存放数据 [root@csdb24 local]# mkdir -p /usr/local/mysql/data [root@csdb24 local]# chown -R mysql:mysql /usr/local/mysql 4、解压-编译安装 [root@csdb24 mysql]# pwd /usr/local/mysql [root@csdb24 mysql]# tar -zxvf mysql-5.6.12.tar.gz [root@csdb24 mysql]# ll 总用量 35044 drwxr-xr-x 2 mysql mysql 4096 3 月 27 11:29 data drwxr-xr-x 33 7161 wheel 4096 5 月 21 2013 mysql-5.6.12 -rw-r--r-- 1 mysql mysql 35876046 3 月 27 11:32 mysql-5.6.12.tar.gz 进入解压目录,然后执行编译。 美河学习在线 www.eimhe.com cd mysql-5.6.12 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DINSTALL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DEXTRA_CHARSETS=all \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DMYSQL_USER=mysql \ -DMYSQL_TCP_PORT=3306 make && make install 或者 make -j 2 && make install //-j 指定几个 CPU 核心去编译 注意事项: 如安装失败重新编译时,需要清除旧的对象文件和缓存信息。 shell> make clean shell> rm -f CMakeCache.txt shell> rm -rf /etc/my.cnf 安装完成查看内容: [root@csdb24 mysql]# ll 总用量 32368 drwxr-xr-x 2 root root 4096 3 月 30 14:19 bin -rw-r--r-- 1 root root 17987 7 月 18 2014 COPYING drwxr-xr-x 3 mysql mysql 4096 3 月 30 14:19 data drwxr-xr-x 2 root root 4096 3 月 30 14:19 docs drwxr-xr-x 3 root root 4096 3 月 30 14:19 include -rw-r--r-- 1 root root 88927 7 月 18 2014 INSTALL-BINARY drwxr-xr-x 3 root root 4096 3 月 30 14:19 lib drwxr-xr-x 4 root root 4096 3 月 30 14:19 man drwxr-xr-x 35 7161 wheel 4096 3 月 30 14:19 mysql-5.6.20 -rw-r--r-- 1 root root 32979820 3 月 27 22:38 mysql-5.6.20.tar.gz drwxr-xr-x 10 root root 4096 3 月 30 14:19 mysql-test -rw-r--r-- 1 root root 2496 7 月 18 2014 README drwxr-xr-x 2 root root 4096 3 月 30 14:19 scripts drwxr-xr-x 28 root root 4096 3 月 30 14:19 share 美河学习在线 www.eimhe.com drwxr-xr-x 4 root root 4096 3 月 30 14:19 sql-bench drwxr-xr-x 2 root root 4096 3 月 30 14:19 support-files 5、安装完成后查看 1、查看安装目录情况 [root@rbdb-cs mysql]# ls bin docs lib mysql-5.6.20 README sql- bench COPYING include man mysql-5.6.20.tar.gz scripts support- files data INSTALL-BINARY mysql-5.6.12.tar.gz mysql-test share 2、data 目录情况 [root@rbdb-cs mysql]# cd data/ [root@rbdb-cs data]# ls test 安装完成后,在/etc 目录下面生产了一个 my.cnf 文件,这个文件的参数不是规划的参数,所 以需要修改这个参数文件,如下: [root@rbdb-cs etc]# pwd /etc [root@rbdb-cs etc]# ls -l|grep my -rw-r--r--. 1 root root 251 10 月 12 2013 my.cnf [root@rbdb-cs etc]# cat my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 6、注册服务 进入安装目录下的 support-files 文件夹: [root@csdb24 support-files]# pwd 美河学习在线 www.eimhe.com /usr/local/mysql/support-files [root@csdb24 support-files]# ll 总用量 32 -rwxr-xr-x 1 root root 1153 3 月 30 14:08 binary-configure -rw-r--r-- 1 root root 773 7 月 18 2014 magic -rw-r--r-- 1 root root 1126 3 月 30 14:08 my-default.cnf -rwxr-xr-x 1 root root 1061 3 月 30 14:08 mysqld_multi.server -rwxr-xr-x 1 root root 894 3 月 30 14:08 mysql-log-rotate -rwxr-xr-x 1 root root 10880 3 月 30 14:08 mysql.server 使用默认配置文件 [root@csdb24 support-files]# cp my-default.cnf /etc/my.cnf cp:是否覆盖"/etc/my.cnf"? y [root@csdb24 support-files]# 注册服务: [root@csdb24 support-files]# cp mysql.server /etc/rc.d/init.d/mysql 修改执行权限 [root@csdb24 init.d]# pwd /etc/rc.d/init.d [root@csdb24 init.d]# ls -l|grep my -rw-r--r-- 1 root root 10880 3 月 27 16:55 mysql [root@csdb24 init.d]# [root@csdb24 init.d]# [root@csdb24 init.d]# chmod +x mysql [root@csdb24 init.d]# ls -l|grep my -rwxr-xr-x 1 root root 10880 3 月 27 16:55 mysql 设置开机启动 [root@csdb24 mysql]# chkconfig --add mysql [root@csdb24 mysql]# chkconfig mysql on 修改安装目录权限: [root@csdb24 mysql]# chown -R mysql:mysql /usr/local/mysql/ 7、初始化数据库 mysql_install_db --basedir=/usr/local/mysql --datadir=//usr/local/mysql/data/ --user=mysql -- defaults-file=/usr/local/mysql/my.cnf 或者添加--tmpdir 美河学习在线 www.eimhe.com ./mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql -- defaults-file=/usr/local/mysql/my.cnf --tmpdir=/tmp [root@csdb24 scripts]# pwd /usr/local/mysql/scripts [root@csdb24 scripts]# ll 总用量 36 -rwxr-xr-x 1 root root 34544 3 月 30 14:08 mysql_install_db [root@csdb24 scripts]# ./mysql_install_db --basedir=/usr/local/mysql -- datadir=/usr/local/mysql/data/ --user=mysql --defaults-file=/usr/local/mysql/my.cnf Installing MySQL system tables...2015-03-30 14:30:02 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-30 14:30:02 16780 [Note] InnoDB: Using atomics to ref count buffer pool pages 2015-03-30 14:30:02 16780 [Note] InnoDB: The InnoDB memory heap is disabled 2015-03-30 14:30:02 16780 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2015-03-30 14:30:02 16780 [Note] InnoDB: Memory barrier is not used 2015-03-30 14:30:02 16780 [Note] InnoDB: Compressed tables use zlib 1.2.3 2015-03-30 14:30:02 16780 [Note] InnoDB: Using Linux native AIO 2015-03-30 14:30:02 16780 [Note] InnoDB: Using CPU crc32 instructions 2015-03-30 14:30:02 16780 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2015-03-30 14:30:02 16780 [Note] InnoDB: Completed initialization of buffer pool 2015-03-30 14:30:02 16780 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! 2015-03-30 14:30:02 16780 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB 2015-03-30 14:30:02 16780 [Note] InnoDB: Database physically writes the file full: wait... 2015-03-30 14:30:02 16780 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB 2015-03-30 14:30:03 16780 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB 2015-03-30 14:30:03 16780 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0 2015-03-30 14:30:03 16780 [Warning] InnoDB: New log files created, LSN=45781 2015-03-30 14:30:03 16780 [Note] InnoDB: Doublewrite buffer not found: creating new 2015-03-30 14:30:03 16780 [Note] InnoDB: Doublewrite buffer created 2015-03-30 14:30:03 16780 [Note] InnoDB: 128 rollback segment(s) are active. 2015-03-30 14:30:03 16780 [Warning] InnoDB: Creating foreign key constraint system tables. 2015-03-30 14:30:03 16780 [Note] InnoDB: Foreign key constraint system tables created 2015-03-30 14:30:03 16780 [Note] InnoDB: Creating tablespace and datafile system tables. 2015-03-30 14:30:03 16780 [Note] InnoDB: Tablespace and datafile system tables created. 2015-03-30 14:30:03 16780 [Note] InnoDB: Waiting for purge to start 2015-03-30 14:30:03 16780 [Note] InnoDB: 5.6.20 started; log sequence number 0 2015-03-30 14:30:03 16780 [Note] Binlog end 2015-03-30 14:30:03 16780 [Note] InnoDB: FTS optimize thread exiting. 2015-03-30 14:30:03 16780 [Note] InnoDB: Starting shutdown... 2015-03-30 14:30:05 16780 [Note] InnoDB: Shutdown completed; log sequence number 1625977 美河学习在线 www.eimhe.com OK Filling help tables...2015-03-30 14:30:05 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-30 14:30:05 16802 [Note] InnoDB: Using atomics to ref count buffer pool pages 2015-03-30 14:30:05 16802 [Note] InnoDB: The InnoDB memory heap is disabled 2015-03-30 14:30:05 16802 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2015-03-30 14:30:05 16802 [Note] InnoDB: Memory barrier is not used 2015-03-30 14:30:05 16802 [Note] InnoDB: Compressed tables use zlib 1.2.3 2015-03-30 14:30:05 16802 [Note] InnoDB: Using Linux native AIO 2015-03-30 14:30:05 16802 [Note] InnoDB: Using CPU crc32 instructions 2015-03-30 14:30:05 16802 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2015-03-30 14:30:05 16802 [Note] InnoDB: Completed initialization of buffer pool 2015-03-30 14:30:05 16802 [Note] InnoDB: Highest supported file format is Barracuda. 2015-03-30 14:30:05 16802 [Note] InnoDB: 128 rollback segment(s) are active. 2015-03-30 14:30:05 16802 [Note] InnoDB: Waiting for purge to start 2015-03-30 14:30:05 16802 [Note] InnoDB: 5.6.20 started; log sequence number 1625977 2015-03-30 14:30:05 16802 [Note] Binlog end 2015-03-30 14:30:05 16802 [Note] InnoDB: FTS optimize thread exiting. 2015-03-30 14:30:05 16802 [Note] InnoDB: Starting shutdown... 2015-03-30 14:30:07 16802 [Note] InnoDB: Shutdown completed; log sequence number 1625987 OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/local/mysql/bin/mysqladmin -u root password 'new-password' /usr/local/mysql/bin/mysqladmin -u root -h csdb24 password 'new-password' Alternatively you can run: /usr/local/mysql/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: 美河学习在线 www.eimhe.com cd . ; /usr/local/mysql/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl Please report any problems at http://bugs.mysql.com/ The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com WARNING: Found existing config file /usr/local/mysql/my.cnf on the system. Because this file might be in use, it was not replaced, but was used in bootstrap (unless you used --defaults-file) and when you later start the server. The new default config file was created as /usr/local/mysql/my-new.cnf, please compare it with your file and take the changes you need. WARNING: Default config file /etc/my.cnf exists on the system This file will be read by default by the MySQL server If you do not want to use this, either remove it, or use the --defaults-file argument to mysqld_safe when starting the server 出现这样的日志信息,表示安装成功。 初始化数据库完成后,在 data 目录下面出现了数据文件。 [root@rbdb-cs data]# ls auto.cnf ib_logfile0 mysql rbdb-cs.err test ibdata1 ib_logfile1 performance_schema rbdb-cs.pid 8、启动 mysql 服务 [root@csdb24 mysql]# service mysql start Starting MySQL.[确定] [root@csdb24 mysql]# netstat -lanp |grep 3306 tcp 0 0 :::3306 :::* LISTEN 16999/mysqld 美河学习在线 www.eimhe.com [root@csdb24 mysql]# ps -ef|grep mysql root 16884 1 0 14:55 pts/3 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe - -datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/csdb24.pid mysql 16999 16884 1 14:55 pts/3 00:00:00 /usr/local/mysql/bin/mysqld -- basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/csdb24.err --pid- file=/usr/local/mysql/data/csdb24.pid root 17032 14541 0 14:56 pts/3 00:00:00 grep mysql 9、配置安装环境变量 对 root 用户进行环境变量设置。 [root@csdb24 ~]# vi .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib export PATH ".bash_profile" 14L, 230C written [root@csdb24 ~]# source .bash_profile 10、设置 root 用户密码及打开远程连接 [root@csdb24 ~]# mysql -u root mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.20 Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. 美河学习在线 www.eimhe.com Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql Database changed mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; Query OK, 0 rows affected (0.00 sec) mysql> update user set Password = password('root') where User='root'; Query OK, 4 rows affected (0.00 sec) Rows matched: 5 Changed: 4 Warnings: 0 mysql> select Host,User,Password from user where User='root'; +-----------+------+-------------------------------------------+ | Host | User | Password | +-----------+------+-------------------------------------------+ | localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | csdb24 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | 127.0.0.1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | ::1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | % | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-----------+------+-------------------------------------------+ 5 rows in set (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 使用密码登陆: [root@csdb24 ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.6.20 Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. 美河学习在线 www.eimhe.com Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 11、安装目录结构 安装目录/usr/local/mysql/下的目录结构 Directory Contents of Directory bin Client programs and the mysqld server data Log files, databases docs Manual in Info format man Unix manual pages include Include (header) files lib Libraries scripts mysql_install_db share Miscellaneous support files, including error messages, sample configuration files, SQL for database installation sql-bench Benchmarks 5、安装问题 1、cmake 时-警告:此函数中的“”在使用前可能未初始化 [ 91%] Building CXX object libmysqld/CMakeFiles/sql_embedded.dir/__/sql/sql_partition.cc.o /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc: In member function ‘void Optimize_table_order::best_access_path(JOIN_TAB*, table_map, uint, bool, double, POSITION*, POSITION*)’: /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_loose_scan_start_key’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_max_loose_keypart’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_loose_scan_records’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 美河学习在线 www.eimhe.com ‘loose_scan_opt.Loose_scan_opt::best_loose_scan_key’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::quick_max_loose_keypart’在使用前可能未初始化 [ 91%] Building CXX object sql/CMakeFiles/sql.dir/sql_plugin.cc.o [ 92%] Building CXX object libmysqld/CMakeFiles/sql_embedded.dir/__/sql/sql_partition_admin.cc.o [ 92%] Building CXX object sql/CMakeFiles/sql.dir/sql_prepare.cc.o [ 92%] Building CXX object libmysqld/CMakeFiles/sql_embedded.dir/__/sql/sql_planner.cc.o /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc: In member function ‘void Optimize_table_order::best_access_path(JOIN_TAB*, table_map, uint, bool, double, POSITION*, POSITION*)’: /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_loose_scan_start_key’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_max_loose_keypart’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_loose_scan_records’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::best_loose_scan_key’在使用前可能未初始化 /usr/local/mysql/mysql-5.6.20/sql/sql_planner.cc:431: 警告:此函数中的 ‘loose_scan_opt.Loose_scan_opt::quick_max_loose_keypart’在使用前可能未初始化 [ 92%] Building CXX object sql/CMakeFiles/sql.dir/sql_profile.cc.o 2、make install 时-/ usr/bin/ld:cannot find -lncurses Linking CXX executable mysql /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../libncurses.so when searching for -lncurses /usr/bin/ld: skipping incompatible /usr/lib/libncurses.so when searching for -lncurses /usr/bin/ld: cannot find -lncurses collect2: ld 返回 1 make[2]: *** [client/mysql] 错误 1 make[1]: *** [client/CMakeFiles/mysql.dir/all] 错误 2 make: *** [all] 错误 2 http://blog.sina.com.cn/s/blog_4ebc3d6c010199ti.html 今天在编译代码的时候出现 “/usr/bin/ld: cannot find -luuid” 错误,在网上找了些资料发现是 gcc 编译时找不到链接的库,解决办法如下: 1. 在终端下运行命令: locate libuuid 说明:出现的错误是 luuid,为什么在 locate 后面是 libuuid,这是由于链接库的命名造 美河学习在线 www.eimhe.com 成的。假如出现了 “/usr/bin/ld: cannot find -lltdl”,则在终端输入:locate libltdl,即把 -l 去 掉。 我的系统中运行 locate libuuid 命令后 ,出现的内容如下: /lib/libuuid.so.1 /lib/libuuid.so.1.3.0 /usr/i586-mingw32msvc/lib/libuuid.a /usr/lib/wine/libuuid.a /usr/share/doc/libuuid-perl /usr/share/doc/libuuid1 /usr/share/doc/libuuid-perl/changelog.Debian.gz /usr/share/doc/libuuid-perl/changelog.gz /usr/share/doc/libuuid-perl/copyright /usr/share/doc/libuuid1/changelog.Debian.gz /usr/share/doc/libuuid1/changelog.gz /usr/share/doc/libuuid1/copyright /var/lib/libuuid /var/lib/dpkg/info/libuuid-perl.list /var/lib/dpkg/info/libuuid-perl.md5sums /var/lib/dpkg/info/libuuid1.list /var/lib/dpkg/info/libuuid1.md5sums /var/lib/dpkg/info/libuuid1.postinst /var/lib/dpkg/info/libuuid1.postrm /var/lib/dpkg/info/libuuid1.shlibs /var/lib/dpkg/info/libuuid1.symbols 申明: 若是没有装 uuid 的库是不会出现上面红色部分的,若是没装 uuid 库,打开新立得 安装 uuid 有关的库,即可解决! 2.创建相应的链接文件。 注意到其中的/lib/libuuid.so.1, /lib/libuuid.so.1.3.0,我选择/lib/libuuid.so.1 并为其创建 链接文件,终端命令如下: sudo ln -sf /lib/libuuid.so.1 /usr/lib/libuuid.so 3.命令成功后,会在 /usr/lib 目录下生成 libuuid.so 再次编译代码,成功! 上述方法应该可以解决所有 /usr/bin/ld: cannot find -lxxx 错误,自己未验证,因为以前没遇 到类似的错误! 3、mysql_install_db 时候日志 warning 1、explicit_defaults_for_timestamp Installing MySQL system tables...2015-03-30 14:30:02 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see 美河学习在线 www.eimhe.com documentation for more details). 在 MySQL 5.6.6 之前,TIMESTAMP 的默认行为: . TIMESTAMP 列如果没有明确声明 NULL 属性,默认为 NOT NULL。(而其 他数据类型,如果没有显示声明为 NOT NULL,则允许 NULL 值。)设置 TIMESTAMP 的列值为 NULL,会自动存储为当前 timestamp。 . 表中的第一个 TIMESTAMP 列,如果没有声明 NULL 属性、DEFAULT 或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 属性。 . 表中第二个 TIMESTAMP 列,如果没有声明为 NULL 或者 DEFAULT 子句, 默认自动分配’0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认 分配’0000-00-00 00:00:00′,且没有警告。 美河学习在线 www.eimhe.com 2 列 TIMESTAMP 未声明为 NULL 的默认行为 从 MySQL5.6.6 开始这种默认设置的方法被废弃了。在 MySQL 启动时会出现以下 警告: 1 2 3 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (seedocumentation for more details). 关闭警告,在 my.cnf 中加入 1 2 [mysqld] explicit_defaults_for_timestamp=true 重启 MySQL 后错误消失,这时 TIMESTAMP 的行为如下: . TIMESTAMP 如果没有显示声明 NOT NULL,是允许 NULL 值的,可以直接 设置改列为 NULL,而没有默认填充行为。 . TIMESTAMP 不会默认分配 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 属性。 美河学习在线 www.eimhe.com TIMESTAMP 不设置是否为 NULL . 声明为 NOT NULL 且没有默认子句的 TIMESTAMP 列是没有默认值的。往 数据表中插入列,又没有给 TIMESTAMP 列赋值时,如果是严格 SQL 模 式,会抛出一个错误,如果严格 SQL 模式没有启用,该列会赋值为’0000-00- 00 00:00:00′,同时出现一个警告。(这和 MySQL 处理其他时间类型数据一 样,如 DATETIME) TIMESTAMP 默认设置为 NOT NULL Note: 以上内容和存储引擎选择无关。 美河学习在线 www.eimhe.com 2、New log files created, LSN=45781 2015-03-30 14:30:03 16780 [Warning] InnoDB: New log files created, LSN=45781 3、reating foreign key constraint system tables 2015-03-30 14:30:03 16780 [Warning] InnoDB: Creating foreign key constraint system tables. 4、Found existing config file WARNING: Found existing config file /usr/local/mysql/my.cnf on the system. Because this file might be in use, it was not replaced, but was used in bootstrap (unless you used --defaults-file) and when you later start the server. The new default config file was created as /usr/local/mysql/my-new.cnf, please compare it with your file and take the changes you need. WARNING: Default config file /etc/my.cnf exists on the system This file will be read by default by the MySQL server If you do not want to use this, either remove it, or use the --defaults-file argument to mysqld_safe when starting the server 4、ERROR 1045 (28000): Access denied for user 'root'@'localhost' ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 最近新装好的 mysql 在进入 mysql 工具时,总是有错误提示: # mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 或者 美河学习在线 www.eimhe.com # mysql -u root -p password 'newpassword' Enter password: mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: YES)' 方法操作很简单,如下: # /etc/init.d/mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & # mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root' and host='root' or host='localhost';//把空的用户密码都修改成非空的密码就行了。 mysql> FLUSH PRIVILEGES; mysql> quit # /etc/init.d/mysqld restart # mysql -uroot -p Enter password: <输入新设的密码 newpassword> 5、操作:You must SET PASSWORD before executing this statement MySql5.6 操作时报错:You must SET PASSWORD before executing this statement 解决 mysql> SET PASSWORD = PASSWORD('mysql123'); Query OK, 0 rows affected (0.03 sec) mysql> create database roger; Query OK, 1 row affected (0.00 sec) 也就是用 mysql> SET PASSWORD = PASSWORD('mysql123');这句话重新设置一次密码! 2、配置文件 my.cnf 3、mysql 日志 美河学习在线 www.eimhe.com 1、错误日志 在 mysql 数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况 下,错误日志存储在 mysql 数据库的数据文件中。错误日志文件通常的名称为 hostnam e.err。其中,hostname 表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过 log-error 和 log- warnings 来定义的,其中 log-err 是定义是否启用错误日志的功能和错误日志的存储位 置,log-warnings 是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大 概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如 mys ql 如何启动 InnoDB 的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行 过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进 程时产生的信息。 一般而言,日志级别的定义没有回话变量都只是在全局级别下进行定义。 [root@csdb24 ~]# mysql -u root mysql mysql> show global variables like 'log%'; +----------------------------------------+----------------------------------+ | Variable_name | Value | +----------------------------------------+----------------------------------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | log_error | /usr/local/mysql/data/csdb24.err | | log_output | FILE | | log_queries_not_using_indexes | OFF | | log_slave_updates | OFF | | log_slow_admin_statements | OFF | | log_slow_slave_statements | OFF | | log_throttle_queries_not_using_indexes | 0 | | log_warnings | 1 | +----------------------------------------+----------------------------------+ 13 rows in set (0.00 sec) 其中,log_error 可以直接定义为文件路径,也可以为 ON|OFF;log_warings 只能使用 1|0 来定义开关启动。 更改错误日志位置可以使用 log_error 来设置形式如下: [root@stu18 data]# vim /etc/my.cnf [mysqld] Log_error=DIR/[filename] 美河学习在线 www.eimhe.com 删除错误日志: 在 mysql5.5.7 之前:数据库管理员可以删除很长时间之前的错误日志,以保证 mysql 服务器上的硬盘空间。mysql 数据库中,可以使用 mysqladmin 命令开启新的错误日 志。mysqladmin 命令的语法如下:mysqladmin –u root –pflush-logs 也可以使用 登录 mysql 数据库中使用 FLUSHLOGS 语句来开启新的错误日志。 在 mysql5.5.7 之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手 动冲洗日志创建一个新的。 mv csdb24.err csdb24.err.20150330_1654 mysqladmin flush-logs 方式如下: [root@csdb24 data]# mv csdb24.err csdb24.err.20150330_1654 [root@csdb24 data]# ll 总用量 110616 -rw-rw---- 1 mysql mysql 56 3 月 30 14:55 auto.cnf -rw-r----- 1 mysql root 2037 3 月 30 14:55 csdb24.err.20150330_1654 -rw-rw---- 1 mysql mysql 6 3 月 30 14:55 csdb24.pid -rw-rw---- 1 mysql mysql 12582912 3 月 30 14:55 ibdata1 -rw-rw---- 1 mysql mysql 50331648 3 月 30 14:55 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 3 月 30 14:30 ib_logfile1 drwx------ 2 mysql mysql 4096 3 月 30 14:30 mysql drwx------ 2 mysql mysql 4096 3 月 30 14:30 performance_schema drwxr-xr-x 2 mysql mysql 4096 3 月 30 14:19 test [root@csdb24 data]# mysqladmin flush-logs [root@csdb24 data]# ll 总用量 110616 -rw-rw---- 1 mysql mysql 56 3 月 30 14:55 auto.cnf -rw-rw---- 1 mysql mysql 0 3 月 30 16:54 csdb24.err -rw-r----- 1 mysql root 2037 3 月 30 14:55 csdb24.err.20150330_1654 -rw-rw---- 1 mysql mysql 6 3 月 30 14:55 csdb24.pid -rw-rw---- 1 mysql mysql 12582912 3 月 30 14:55 ibdata1 -rw-rw---- 1 mysql mysql 50331648 3 月 30 14:55 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 3 月 30 14:30 ib_logfile1 drwx------ 2 mysql mysql 4096 3 月 30 14:30 mysql drwx------ 2 mysql mysql 4096 3 月 30 14:30 performance_schema drwxr-xr-x 2 mysql mysql 4096 3 月 30 14:19 test 美河学习在线 www.eimhe.com 2、查询日志 默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查 改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘 IO,会影响 mysql 的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。 查看查询日志是否开启: mysql> show global variables like 'general%'; +------------------+----------------------------------+ | Variable_name | Value | +------------------+----------------------------------+ | general_log | OFF | | general_log_file | /usr/local/mysql/data/csdb24.log | +------------------+----------------------------------+ 2 rows in set (0.00 sec) 拓展解析:日志的输出位置一般有三种方式:file(文件),table(表),none(不保存);其中 前两个输出位置可以同时定义,none 表示是开启日志功能但是记录日志信息。file 就是通 过 general_log_file |/mydata/data/stu18.log 等方式定义的,而输出位置定义为表时 查看日志的内容方式为: mysql> use mysql Database changed mysql> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | innodb_table_stats | | ndb_binlog_index | | plugin | | proc | | procs_priv | | user | ……………………………… +---------------------------+ 美河学习在线 www.eimhe.com 28 rows in set (0.00 sec) general_log #这个就是查询日志的表输出位置 3、慢查询日志 慢查询日志: 慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出 哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微 乎其微,但是可以记录 mysql 服务器上执行了很长时间的查询语句。可以帮助我们定位性 能问题的。 查看慢查询日志的定义: mysql> show global variables like 'slow_query%'; +---------------------+---------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/mysql/data/csdb24-slow.log | +---------------------+---------------------------------------+ 2 rows in set (0.00 sec) 启动和设置慢查询日志: 1、通过配置文件 my.cnf 中的 log-slow-queries 选项可以开启慢查询日志,形式如下: [root@stu18 data]# vim /etc/my.cnf [mysqld] slow_query_log=1 log-slow-queries [= DIR/[filename] ] 其中,DIR 参数指定慢查询日志的存储路径;filename 参数指定日志的文件名,生成日志 文件的完成名称为 filename-slow.log。如果不指定存储路径,慢查询日志默认存储到 mysql 数据库的数据文件下,如果不指定文件名,默认文件名为 hostname-slow.log 2、通过登录 mysql 服务器直接定义,方式如下: 首先要有全局权限;然后执行 mysql>set global slow_query_log=1; 一般都是通过 long_query_time 选项来设置这个时间值,时间以秒为单位,可以精确到 微秒。如果查询时间超过了这个时间值(默认为 10 秒),这个查询语句将被记录到慢查 询日志中。查看服务器默认时间值方式如下: 美河学习在线 www.eimhe.com mysql> show global variables like 'long%'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec) 注释:其中这个慢查询时间并不是只表示语句自身执行超过 10 秒还包含由于其他资源被征 用造成阻塞的查询执行时间或其他原因等都被记录到慢查询中。所以这个慢查的时长表示从 查询开始到查询结束中间包含可能的任何原因所经历的所有时间。 测试是否可以记录日志: mysql> set global slow_query_log=1; #开启慢查询日志 Query OK, 0 rows affected (0.35 sec) mysql> set session long_query_time=0.001; #更改时间(当前 session 中,退出则重置) Query OK, 0 rows affected (0.00 sec) mysql> set global long_query_time=0.001; #更改时间(全局中,重启服务则重置) mysql> SHOW VARIABLES LIKE 'long%'; #查询定义时间 +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time |0.001000 | +-----------------+----------+ 1 row in set (0.00sec) mysql> show global variables like "%slow%"; #查看慢查询日志开启状态 +---------------------+-----------------------------+ | Variable_name | Value | +---------------------+-----------------------------+ |log_slow_queries | ON | |slow_launch_time | 2 | |slow_query_log | ON | |slow_query_log_file | /mydata/data/stu18-slow.log | +---------------------+-----------------------------+ 4 rows in set (0.03sec) 查看慢查询日志: mysql> use mysql mysql> selectuser,host,password from user where user="root"; +------+------------------+----------+ | user | host | password | +------+------------------+----------+ | root |localhost | | | root |stu18.magedu.com | | | root |127.0.0.1 | | | root | ::1 | | 美河学习在线 www.eimhe.com +------+------------------+----------+ 4 rows in set (0.08sec) #查询时间为 0.08 mysql> systemmore /mydata/data/stu18_slow.log #查询慢查询日志记录信息 /usr/local/mysql/bin/mysqld,Version: 5.5.33-log (Source distribution). started with: Tcp port: 3306 Unix socket: /tmp/mysql.sock Time Id Command Argument >>>>>>>>>>>>>>>>部分已省略>>>>>>>>>>>>>> # Time: 13100723:46:33 # User@Host:root[root] @ localhost [] # Query_time:0.108459 Lock_time: 0.000216 Rows_sent:4 Rows_examined: 6 SETtimestamp=1381160793; selectuser,host,password from user where user="root"; 4、事务日志 事务日志(InnoDB 特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在 修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志 中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志 的操作是磁盘上一小块区域内的顺序 I/O,而不像随机 I/O 需要在磁盘的多个地方移动磁 头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数 据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之 为预写式日志,修改数据需要写两次磁盘。 如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩 溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而 定。 查看事务日志的定义: mysql> show global variables like 'innodb%log%'; +----------------------------------+-----------+ | Variable_name | Value | +----------------------------------+-----------+ | innodb_api_enable_binlog | OFF | | innodb_flush_log_at_timeout | 1 | | innodb_flush_log_at_trx_commit | 1 | | innodb_locks_unsafe_for_binlog | OFF | | innodb_log_buffer_size | 8388608 | | innodb_log_compressed_pages | ON | | innodb_log_file_size | 50331648 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_mirrored_log_groups | 1 | 美河学习在线 www.eimhe.com | innodb_online_alter_log_max_size | 134217728 | | innodb_undo_logs | 128 | +----------------------------------+-----------+ 12 rows in set (0.00 sec) [root@csdb24 data]# ls -lh 总用量 109M -rw-rw---- 1 mysql mysql 56 3 月 30 14:55 auto.cnf -rw-rw---- 1 mysql mysql 0 3 月 30 16:54 csdb24.err -rw-r----- 1 mysql root 2.0K 3 月 30 14:55 csdb24.err.20150330_1654 -rw-rw---- 1 mysql mysql 6 3 月 30 14:55 csdb24.pid -rw-rw---- 1 mysql mysql 395 3 月 30 18:58 csdb24-slow.log -rw-rw---- 1 mysql mysql 12M 3 月 30 14:55 ibdata1 -rw-rw---- 1 mysql mysql 48M 3 月 30 14:55 ib_logfile0 -rw-rw---- 1 mysql mysql 48M 3 月 30 14:30 ib_logfile1 drwx------ 2 mysql mysql 4.0K 3 月 30 14:30 mysql drwx------ 2 mysql mysql 4.0K 3 月 30 14:30 performance_schema drwxr-xr-x 2 mysql mysql 4.0K 3 月 30 14:19 test 5、二进制日志 二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的 mysql 语句, 并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询 mysql 数据库中进行了哪些变化。一般大小体积上限为 1G。 1:数据恢复 如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致 你的数据库出问题了,想办法挽回损失。 2:主从服务器之间同步数据 主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。 1.前言 日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件就叫做日志文件。 Mysql 默认只打开出错日志,因为过多的日志将会影响系统的处理性能。 在 5.0 前支持文本格式和二进制格式,5.0 后只支持二进制格式,因为二进制日志在性 能、信息处理方面有更多的优点。 2.基础知识 2.1、二进制日志的启用 二进制日志由配置文件的 log-bin 选项负责启用,Mysql 服务器将在数据根目录创建 美河学习在线 www.eimhe.com 两个新文件 XXX-bin.001 和 XXX-bin.index,若配置选项没有给出文件名,Mysql 将使 用主机名称命名这两个文件,其中.index 文件包含一份全体日志文件的清单。 Mysql 会把用户对所有数据库的内容和结构的修改情况记入 XXX-bin.n 文件,而不会 记录 SELECT 和没有实际 2.2、更新的 UPDATE 语句。 日志文件的扩展 当停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql 会在重启时生成 一个新的日志文件,文件序号递增,此外,如果日志文件超过 max_binlog_size 系统变 量配置的上限时,也会生成新的日志文件。 2.3、日志文件的查看 Mysql 提供了 mysqlbinlog 命令来查看日志文件,如 mysqlbinlog xxx-bin.001 | more。在记录每条变更日志的时候,日志文件都会把当前时间给记录下来,以便进行数 据库恢复。 2.4、日志文件的停用 可以使用 SET SQL_LOG_BIN=0 命令停止使用日志文件,然后可以通过 SET SQL_LOG_BIN=1 命令来启用。 2.5、使用日志进行数据库恢复 如果遇到灾难事件,应该用最近一次制作的完整备份恢复数据库,然后使用备份之后 的日志 文件把数据库恢复到最接近现在的可用状态。 使用日志进行恢复时需要依次进行,即最早生成的日志文件要最先恢复: mysqlbinlog xxx-bin.00001 | mysql -u root -p mysqlbinlog xxx-bin.00002 | mysql -u root -p 3.日志跟换策略 使用索引来循环文件,在以下条件将循环至下一个索引 a.服务器重启 b.服务器被更新 c.日志达到了最大日志长度 max_binlog_size d.日志被刷新 mysql> flush logs; 4.日志格式 从官网文档中看到,之前的 MySQL 一直都只有基于 statement 的复制模式,直到 5.1.5 版本的 MySQL 才开始支持 row level 的复制。从 5.0 开始,MySQL 的复制已经 解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给 MySQL Replication 复制又带来了更大的新挑战。另外,看到官方文档说,从 5.1.8 版本开始, MySQL 提供了除 Statement Level 和 Row Level 之外的第三种复制模式:Mixed,实 际上就前两种模式的结合。在 Mixed 模式下,MySQL 会根据执行的每一条具体的 sql 语 句来区分对待记录的日志形式,也就是在 Statement 和 Row 之间选择一种。新版本中的 Statement Level 还是和以前一样,仅仅记录执行的语句。而新版本的 MySQL 中对 row level 模式也被做了优化,并不是所有的修改都会以 row level 来记录,像遇到表结构变 更的时候就会以 statement 模式来记录,如果 sql 语句确实就是 update 或者 delete 等 修改数据的语句,那么还是会记录所有行的变更。 --基于 SQL 语句的复制(statement-based replication,SBR), --基于行的复制(row-based replication,RBR), 美河学习在线 www.eimhe.com --混合模式复制(mixed-based replication,MBR)。 静态设置 binlog 格式: vi my.cnf log-bin = mysql-bin #binlog_format = "STATEMENT" #binlog_format = "ROW" binlog_format = "MIXED" 动态修改 binlog 格式: mysql> SET SESSION binlog_format = 'STATEMENT'; mysql> SET SESSION binlog_format = 'ROW'; mysql> SET SESSION binlog_format = 'MIXED'; mysql> SET GLOBAL binlog_format = 'STATEMENT'; mysql> SET GLOBAL binlog_format = 'ROW'; mysql> SET GLOBAL binlog_format = 'MIXED'; 5.binary log 相关变量和参数 5.1、命令行参数 --log-bin [=file_name] 设置此参数表示启用 binlog 功能,并制定路径名称。 --log-bin-index[=file] 设置此参数是指定二进制索引文件的路径与名称。 --max_binlog_size Binlog 最大值,最大和默认值是 1GB,该设置并不能严格控制 Binlog 的大小,尤其是 Binlog 比较靠近最大值而又遇到一个比较大事务时, 为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有 SQL 都记录进当 前日志,直到事务结束。 --binlog-do-db=db_name 此参数表示只记录指定数据库的二进制日志 --binlog-ignore-db=db_name 此参数表示不记录指定的数据库的二进制日志 5.2、系统变量 log_bin binlog_cache_size 此参数表示 binlog 使用的内存大小,可以通过状态变量 binlog_cache_use 和 binlog_cache_disk_use 来帮助测试。 max_binlog_cache_size 此参数表示 binlog 使用的内存最大的尺寸 binlog_cache_use 使用二进制日志缓存的事务数量 binlog_cache_disk_use 使用二进制日志缓存但超过 binlog_cache_size 值并使用临时文件来保存事务中的语句 的事务数量。 binlog_do_db binlog_ignore_db 美河学习在线 www.eimhe.com sync_binlog 这个参数直接影响 mysql 的性能和完整性。 sync_binlog=0: 当事务提交后,Mysql 仅仅是将 binlog_cache 中的数据写入 binlog 文件,但不执行 fsync 之类的磁盘,同步指令通知文件系统将缓存刷新到磁盘,而让 Filesystem 自行决 定什么时候来做同步,这个是性能最好的。 sync_binlog=0,在进行 n 次事务提交以后,Mysql 将执行一次 fsync 之类的磁盘同步 指令,通知文件系统将 Binlog 文件缓存刷新到磁盘。 Mysql 中默认的设置是 sync_binlog=0,即不做任何强制性的磁盘刷新指令,这时性 能是最好的,但风险也是最大的。一旦系统 Crash,在文件系统缓存中的所有 Binlog 信 息都会丢失。 6.常见问题 6.1、如何清除 binlog --使用下面的两个命令 PURGE {MASTER|BINARY} LOGS TO 'log_name' //log_name 不会被清除 PURGE {MASTER|BINARY} LOGS BEFORE 'date' //date 不会被清除 实例如下: mysql> show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | mysql3306-bin.000001 | 107 | +----------------------+-----------+ 1 row in set (0.00 sec) mysql> flush logs; Query OK, 0 rows affected (0.11 sec) mysql> flush logs; Query OK, 0 rows affected (0.02 sec) mysql> flush logs; Query OK, 0 rows affected (0.01 sec) mysql> flush logs; Query OK, 0 rows affected (0.01 sec) mysql> show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | mysql3306-bin.000001 | 154 | 美河学习在线 www.eimhe.com | mysql3306-bin.000002 | 154 | | mysql3306-bin.000003 | 154 | | mysql3306-bin.000004 | 154 | | mysql3306-bin.000005 | 107 | +----------------------+-----------+ 5 rows in set (0.00 sec) mysql> purge master logs to 'mysql3306-bin.000002'; Query OK, 0 rows affected (0.01 sec) mysql> show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | mysql3306-bin.000002 | 154 | | mysql3306-bin.000003 | 154 | | mysql3306-bin.000004 | 154 | | mysql3306-bin.000005 | 107 | +----------------------+-----------+ 4 rows in set (0.00 sec) [root@node4 data]# date Tue Jul 30 01:27:04 CST 2013 mysql> flush logs; Query OK, 0 rows affected (0.01 sec) mysql> show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | mysql3306-bin.000002 | 154 | | mysql3306-bin.000003 | 154 | | mysql3306-bin.000004 | 154 | | mysql3306-bin.000005 | 154 | | mysql3306-bin.000006 | 107 | +----------------------+-----------+ 5 rows in set (0.00 sec) mysql> purge master logs before '2013-07-30 01:27:04'; Query OK, 0 rows affected (0.02 sec) mysql> show master logs; +----------------------+-----------+ 美河学习在线 www.eimhe.com | Log_name | File_size | +----------------------+-----------+ | mysql3306-bin.000005 | 154 | | mysql3306-bin.000006 | 107 | +----------------------+-----------+ 2 rows in set (0.00 sec) --或使用命令: RESET MASTER 删除之前所有的 binlog,并重新生成新的 binlog,后缀从 000001 开始。 注:如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之 一,则本语句不会起作用,而是失败,并伴随一个错误。 不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服 务器启动后不能复制。 当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。 6.2、记录到二进制日志知的内容配置 binlog-do-db=sales 只记录 sales 库 binlog-ignore-db=sales 除 sales 库不记 录,其他都记录。 但是如果在操作数据库之前,不使用 use $dbname 那么所有的 SQL 都不会记录 如果 使用了 use $dbname,那么判断规则取决于这里的$dbname,而不是 SQL 中操作的库 6.3、二进制日志不准确的处理 默认情况下,并不是每次写入时都将二进制日志与硬盘同步。因此如果操作系统或机器 (不仅仅是 MySQL 服务器)崩溃,有可能二进制日志中最后的语句丢失。 要想防止这种情 况,你可以使用 sync_binlog 全局变量(1 是最安全的值,但也是最慢的),使二进制日志 在每 N 次二进制日志写入后与硬盘同步。 即使 sync_binlog 设置为 1,出现崩溃时,也有 可能表内容和二进制日志内容之间存在不一致性。 如果崩溃恢复时 MySQL 服务器发现二进制日志变短了(即至少缺少一个成功提交的 InnoDB 事务), 如果 sync_binlog =1 并且硬盘/文件系统的确能根据需要进行同步(有 些不需要)则不会发生,则输出错误消息 (“二进制日志<名>比期望的要小”)。 在这种情 况下,二进制日志不准确,复制应从主服务器的数据快照开始。 为了您的安全,请只打开 来源可靠的网址 1、日志开启状态及参数 mysql> show global variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name | Value | 美河学习在线 www.eimhe.com +---------------------------------+-------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+-------+ 6 rows in set (0.00 sec) 二进制日志相关的参数: sql_log_bin ={ON|OFF} #用于控制会话级别二进制日志功能的开启或关闭。默认为 ON,表 示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有 SUPER 权限。 binlog_cache_size =32768 #默认值 32768 Binlog Cache 用于在打开了二进制日志(binlog) 记录功能的环境,是 MySQL 用来提高 binlog 的记录效率而设计的一个用于短时间内临时 缓存 binlog 数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不 是特别频繁,2MB~4MB 是一个合适的选择。但是如果我们的数据库大事务较多,写入量 比较大,可与适当调高 binlog_cache_size。同时,我们可以通过 binlog_cache_use 以及 binlog_cache_disk_use 来分析设置的 binlog_cache_size 是否足够,是否有大量的 binlog_cache 由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。 binlog_stmt_cache_size= 32768 #当非事务语句使用二进制日志缓存,但是超出 binlog_stmt_cache_size 时,使用一个临时文件来存放这些语句。 log_bin = mysql-bin#指定 binlog 的位置,默认在数据目录下。 binlog-format= {ROW|STATEMENT|MIXED} #指定二进制日志的类型,默认为 MIXED。如果 设定了二进制日志的格式,却没有启用二进制日志,则 MySQL 启动时会产生警告日志信息 并记录于错误日志中。 sync_binlog = 10#设定多久同步一次二进制日志至磁盘文件中,0 表示不同步,任何正数值 都表示对二进制每多少次写操作之后同步一次。当 autocommit 的值为 1 时,每条语句的执 行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步 max_binlog_cache_size= {4096 .. 18446744073709547520} #二进定日志缓存空间大小, 5.5.9 及以后的版本仅应用于事务缓存,其上限由 max_binlog_stmt_cache_size 决定。 max_binlog_stmt_cache_size= {4096 .. 18446744073709547520} #二进定日志缓存空间大 小,5.5.9 及以后的版本仅应用于事务缓存 expire_log_days ={0..99} #设定二进制日志的过期天数,超出此天数的二进制日志文件将被 自动删除。默认为 0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常 发生在 MySQL 启动时或 FLUSH 日志时。 2、二进制日志- binlog_format mysql 复制主要有三种方式:基于 SQL 语句的复制(statement-based replication, SBR),基于 行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应 的,binlog 的格式也有三种:STATEMENT,ROW,MIXED。 美河学习在线 www.eimhe.com ① STATEMENT 模式(SBR) 每一条会修改数据的 sql 语句会记录到 binlog 中。优点是并不需要记录每一条 sql 语句和每 一行的数据变化,减少了 binlog 日志量,节约 IO,提高性能。缺点是在某些情况下会导致 master-slave 中的数据不一致(如 sleep()函数, last_insert_id(),以及 user-defined functions(udf)等会出现问题) ② ROW 模式(RBR) 不记录每条 sql 语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且 不会出现某些特定情况下的存储过程、或 function、或 trigger 的调用和触发无法被正确复 制的问题。缺点是会产生大量的日志,尤其是 alter table 的时候会让日志暴涨。 ③ MIXED 模式(MBR) 以上两种模式的混合使用,一般的复制使用 STATEMENT 模式保存 binlog,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog,MySQL 会根据执行的 SQL 语句选择日志保 存方式。 binlog 复制配置 在 mysql 的配置文件 my.cnf 中,可以通过一下选项配置 binglog 相关 代码如下 复制代码 binlog_format = MIXED //binlog 日志格式,mysql 默 认采用 statement,建议使用 mixed log-bin = /data/mysql/mysql-bin.log //binlog 日志文件 expire_logs_days = 7 //binlog 过期清理时间 max_binlog_size = 100m //binlog 每个日志文件大小 binlog_cache_size = 4m //binlog 缓存大小 max_binlog_cache_size = 512m //最大 binlog 缓存大小 三 MIXED 说明 对于执行的 SQL 语句中包含 now()这样的时间函数,会在日志中产生对应的 unix_timestamp()*1000 的时间字符串,slave 在完成同步时,取用的是 sqlEvent 发生的时间 来保证数据的准确性。另外对于一些功能性函数 slave 能完成相应的数据同步,而对于上面 指定的一些类似于 UDF 函数,导致 Slave 无法知晓的情况,则会采用 ROW 格式存储这些 Binlog,以保证产生的 Binlog 可以供 Slave 完成数据同步。 现在来比较以下 SBR 和 RBR 2 中模式各自的优缺点: SBR 的优点: 历史悠久,技术成熟 binlog 文件较小 binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况 binlog 可以用于实时的还原,而不仅仅用于复制 主从版本可以不一样,从服务器版本可以比主服务器版本高 SBR 的缺点: 不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。 调用具有不确定因素的 UDF 时复制也可能出问题 使用以下函数的语句也无法被复制: * LOAD_FILE() * UUID() 美河学习在线 www.eimhe.com * USER() * FOUND_ROWS() * SYSDATE() (除非启动时启用了 --sysdate-is-now 选项) INSERT ... SELECT 会产生比 RBR 更多的行级锁 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求 更多的行级锁 对于有 AUTO_INCREMENT 字段的 InnoDB 表而言,INSERT 语句会阻塞其他 INSERT 语句 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那 个发生变化的记录产生影响 存储函数(不是存储过程)在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也 可能是好事 确定了的 UDF 也需要在从服务器上执行 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错 执行复杂语句如果出错的话,会消耗更多资源 RBR 的优点: 任何情况都可以被复制,这对复制来说是最安全可靠的 和其他大多数数据库系统的复制技术一样 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多 复制以下几种语句时的行锁更少: * INSERT ... SELECT * 包含 AUTO_INCREMENT 字段的 INSERT * 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句 执行 INSERT,UPDATE,DELETE 语句时锁更少 从服务器上采用多线程来执行复制成为可能 RBR 的缺点: binlog 大了很多 复杂的回滚时 binlog 中会包含大量的数据 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会 写一次,这会导致频繁发生 binlog 的并发写问题 UDF 产生的大 BLOB 值会导致复制变慢 无法从 binlog 中看到都复制了写什么语句 当在非事务表上执行一段堆积的 SQL 语句时,最好采用 SBR 模式,否则很容易导致主从 服务器的数据不一致情况发生 另外,针对系统库 mysql 里面的表发生变化时的处理规则如下: 如果是采用 INSERT,UPDATE,DELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录 如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何都采用 SBR 模式记录 注:采用 RBR 模式后,能解决很多原先出现的主键重复问题 美河学习在线 www.eimhe.com 3、日志定义方式及格式 其一、log_bin 可以直接定义为文件路径,也可以为 ON|OFF。 其二、通过编辑 my.cnf 中的 log-bin 选项可以开启二进制日志;形式如下: [root@stu18 ~]#my.cnf [mysqld] log-bin [=DIR \ [filename]] 其中,DIR 参数指定二进制文件的存储路径;filename 参数指定二级制文件的文件名, 其形式为 filename.number,number 的形式为 000001、000002 等。每次重启 mys ql 服务或运行 mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的 number 会不断地递增。除了生成上述的文件外还会生成一个名为 filename.index 的文 件。这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。 [root@stu18 ~]# cd /mydata/data/ [root@stu18 data]#ls -lh -rw-rw---- 1 mysqlmysql 14K Aug 13 15:30 mysql-bin.000001 -rw-rw---- 1 mysqlmysql 150 Aug 13 17:05 mysql-bin.000002 -rw-rw---- 1 mysqlmysql 150 Aug 13 17:06 mysql-bin.000003 -rw-rw---- 1 mysqlmysql 150 Aug 13 17:07 mysql-bin.000004 -rw-rw---- 1 mysqlmysql 150 Aug 13 17:39 mysql-bin.000005 -rw-rw---- 1 mysqlmysql 126 Aug 13 19:03 mysql-bin.000006 -rw-rw---- 1 mysqlmysql 126 Aug 13 19:03 mysql-bin.000007 -rw-rw---- 1 mysqlmysql 126 Aug 13 19:05 mysql-bin.000008 -rw-rw---- 1 mysqlmysql 107 Aug 13 19:05 mysql-bin.000009 -rw-rw---- 1 mysqlmysql 353 Oct 7 23:40 mysql-bin.000010 -rw-rw---- 1 mysqlmysql 190 Oct 7 20:43 mysql-bin.index [root@stu18 data]#cat mysql-bin.index ./mysql-bin.000001 ./mysql-bin.000002 ./mysql-bin.000003 ./mysql-bin.000004 ./mysql-bin.000005 ./mysql-bin.000006 ./mysql-bin.000007 ./mysql-bin.000008 ./mysql-bin.000009 ./mysql-bin.000010 如果说我们向某个表的某个字段插入一个数据而这个数据为当前时间(日期时间型);过段 时间将此二进制文件应用到另一台服务器上数据就会变动从而导致数据的不一致性所以说 对于这种非确定性的数据使用默认的语句定义并不是可靠的; 二进制日志中常用的定义格式: 美河学习在线 www.eimhe.com 1、语句(statement):默认的记录格式; 2、行(row):定义的并非数据本身而是这一行的数据是什么; 3、混合模式(mixed):交替使用行和语句、由 mysql 服务器自行判断。 其中基于行的定义格式数据量会大一些但是可以保证数据的精确性。 查看二进制日志: 二进制日志的定义方式为二进制格式;使用此格式可以存储更多的信息,并且可以使写入 二进制日志的效率更高。但是不能直接使用查看命令打开并查看二进制日志。 mysql> show binary logs; #显示当前服务器使用的二进制文件及大小 +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001| 13814 | | mysql-bin.000002| 150 | | mysql-bin.000003| 150 | | mysql-bin.000004| 150 | | mysql-bin.000005| 150 | | mysql-bin.000006| 126 | | mysql-bin.000007| 126 | | mysql-bin.000008| 126 | | mysql-bin.000009| 107 | | mysql-bin.000010| 353 | +------------------+-----------+ 10 rows in set (0.07sec) mysql> show master logs; #显示主服务器使用的二进制文件及大小 +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001| 13814 | | mysql-bin.000002| 150 | | mysql-bin.000003| 150 | | mysql-bin.000004| 150 | | mysql-bin.000005| 150 | | mysql-bin.000006| 126 | | mysql-bin.000007| 126 | | mysql-bin.000008| 126 | | mysql-bin.000009| 107 | | mysql-bin.000010| 353 | +------------------+-----------+ 10 rows in set (0.02sec) mysql> show master status; #当前使用的二进制文件及所处位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB | 美河学习在线 www.eimhe.com +------------------+----------+--------------+------------------+ | mysql-bin.000010| 353 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00sec) 小扩展:二进制日志的记录位置:通常为上一个事件执行结束时间的位置,每一个日志文 件本身也有自己的元数据所以说对于当前版本的 mysql 来说二进制的开始位置通常为 107; mysql> flush logs; Query OK, 0 rows affected (0.23 sec) 注意:flush logs 一般只会滚动中继日志和二进制日志。 mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000011| 107 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00sec) 4、查看当前二进制文件的信息 mysql> create database yong; Query OK, 1 row affected (0.12 sec) mysql> create table yong.tb1 (id int,name char(20)); Query OK, 0 rowsaffected (0.44 sec) mysql> insert into yong.tb1 values(1,'tom'); Query OK, 1 rowaffected (0.14 sec) mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000011| 479 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00sec) 查看二进制日志信息的命令: SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] mysql> show binlog events\G #查看所有的二进制信息 ***************************87. row *************************** Log_name: mysql-bin.000001 Pos: 13580 美河学习在线 www.eimhe.com Event_type: Query Server_id: 1 End_log_pos: 13688 Info: use `hellodb`; /*!40000 ALTERTABLE `toc` DISABLE KEYS */ ***************************88. row *************************** Log_name: mysql-bin.000001 Pos: 13688 Event_type: Query Server_id: 1 End_log_pos: 13795 Info: use `hellodb`; /*!40000 ALTERTABLE `toc` ENABLE KEYS */ ***************************89. row *************************** Log_name: mysql-bin.000001 Pos: 13795 Event_type: Stop Server_id: 1 End_log_pos: 13814 Info: 89 rows in set (0.00sec) mysql> show binlog events in 'mysql-bin.000011'; #查看指定日志的二进制信息 +------------------+-----+-------------+-----------+-------------+----------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+----------------------------------------------+ | mysql-bin.000011| 4 | Format_desc | 1 | 107 | Server ver: 5.5.33-log, Binlogver: 4 | | mysql-bin.000011 |107 | Query | 1 | 190 | create database yong | | mysql-bin.000011 |190 | Query | 1 | 293 | create table yong.tb1 (idint,name char(20)) | | mysql-bin.000011 |293 | Query | 1 | 357 | BEGIN | | mysql-bin.000011 |357 | Query | 1 | 452 | insert into yong.tb1values(1,'tom') | | mysql-bin.000011 |452 | Xid | 1 | 479 | COMMIT /* xid=103 */ | +------------------+-----+-------------+-----------+-------------+----------------------------------------------+ 6 rows in set (0.00sec) mysql> show binlog events in 'mysql-bin.000011' from 190; #从指定的事件位置开始 +------------------+-----+------------+-----------+-------------+----------------------------------------------+ | Log_name | Pos | Event_type | Server_id |End_log_pos | Info | +------------------+-----+------------+-----------+-------------+----------------------------------------------+ | mysql-bin.000011 |190 | Query | 1 | 293 | create table yong.tb1 (idint,name char(20)) | | mysql-bin.000011 |293 | Query | 1 | 357 | BEGIN | | mysql-bin.000011 |357 | Query | 1 | 452 | insert into yong.tb1values(1,'tom') | | mysql-bin.000011 |452 | Xid | 1 | 479 | COMMIT /* xid=103 */ | 美河学习在线 www.eimhe.com +------------------+-----+------------+-----------+-------------+----------------------------------------------+ 4 rows in set (0.00sec) mysql> show binlog events in 'mysql-bin.000011' from 190 limit 3; #指定偏移量(不是语句,是 事件) +------------------+-----+------------+-----------+-------------+----------------------------------------------+ | Log_name | Pos | Event_type | Server_id |End_log_pos | Info | +------------------+-----+------------+-----------+-------------+----------------------------------------------+ | mysql-bin.000011 |190 | Query | 1 | 293 | create table yong.tb1 (idint,name char(20)) | | mysql-bin.000011 |293 | Query | 1 | 357 | BEGIN | | mysql-bin.000011 |357 | Query | 1 | 452 | insert into yong.tb1values(1,'tom') | +------------------+-----+------------+-----------+-------------+----------------------------------------------+ 3 rows in set (0.00sec) 命令行下查看二进制日志: 由于无法使用 cat 等方式直接打开并查看二进制日志;所以必须使用 mysqlbinlog 命令。 但是当正在执行 mysql 读写操作时建议不要使用此打开正在使用的二进制日志文件;若非 要打开可 flush logs。mysqlbinlog 命令的使用方式: [root@stu18 data]#mysql binlog mysql-bin.000017 #必须在数据目录下 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET@@session.max_insert_delayed_threads=0*/; /*!50003 SET@OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #事件开始处 #131009 0:25:59 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.33-log created 131009 0:25:59 # Warning: thisbinlog is either in use or was not closed properly. BINLOG ' FzJUUg8BAAAAZwAAAGsAAAABAAQANS41LjMzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 107 #131009 0:26:36 server id 1 end_log_pos 192 Query thread_id=12 exec_time=0 error_code=0 #131009 0:26:36 年月日的简写方式;end_log_pos 事件结束处; thread_id=12 哪个会话线程创建的此语句;exec_time=0 执行时长单位为秒;error_code=0 错误代码 0 表示没有 SET TIMESTAMP=1381249596/*!*/; #预设信息(环境设定) 导出此数据库的信息: [root@stu18 data]#mysql binlog mysql-bin.000017 > /tmp/a.sql 美河学习在线 www.eimhe.com 导入此数据库的信息: [root@stu18 data]#mysql < a.sql 5、删除二进制日志信息 二进制日志会记录大量的信息(其中包含一些无用的信息)。如果很长时间不清理二进制 日志,将会浪费很多的磁盘空间。但是,删除之后可能导致数据库崩溃时无法进行恢复, 所以若要删除二进制日志首先将其和数据库备份一份,其中也只能删除备份前的二进制日 志,新产生的日志信息不可删(可以做即时点还原)。也不可在关闭 mysql 服务器之后直接 删除因为这样可能会给数据库带来错误的。若非要删除二进制日志需要做如下操作:导出 备份数据库和二进制日志文件进行压缩归档存储。删除二进制文件的方法如下: 1、删除所有的二进制日志(不可效仿): 使用 RESET MASTER 语句可以删除所有的二进制日志。该语句的形式如下: mysql> reset master; Query OK, 0 rowsaffected (0.17 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001| 107 | +------------------+-----------+ 1 row in set (0.04sec) 解析:首先不建议在生产环境下使用此操作;删除所有的二进制日志后,Mysql 将会重新 创建新的二进制日志。新二进制日志的编号从 000001 开始。 2、根据文件或时间点来删除二进制日志: 语法形式: mysql> PURGE { BINARY | MASTER } LOGS {TO 'log_name' | BEFORE datetime_expr } 其中 TO'log_name'表示把这个文件之前的其他文件都删除掉,也可使用 BEFORE datetime_expr 指定把哪个时间之前的二进制文件删除了。 mysql> PURGEBINARY LOGS TO 'mysql-bin.000007'; Query OK, 0 rowsaffected (0.11 sec) mysql> showbinary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000007| 150 | | mysql-bin.000008| 150 | 美河学习在线 www.eimhe.com | mysql-bin.000009| 150 | | mysql-bin.000010| 150 | | mysql-bin.000011| 150 | | mysql-bin.000012| 150 | | mysql-bin.000013| 150 | | mysql-bin.000014| 150 | | mysql-bin.000015| 150 | | mysql-bin.000016| 150 | | mysql-bin.000017| 483 | +------------------+-----------+ 11 rows in set (0.04sec) [root@stu18 data]#cat mysql-bin.index ./mysql-bin.000007 ./mysql-bin.000008 ./mysql-bin.000009 ./mysql-bin.000010 ./mysql-bin.000011 ./mysql-bin.000012 ./mysql-bin.000013 ./mysql-bin.000014 ./mysql-bin.000015 ./mysql-bin.000016 ./mysql-bin.000017 由此可以看出这种清理二进制日志文件的方式是非常合理的,不会导致数据库的错误发 生。 mysql> PURGEBINARY LOGS BEFORE '13-10-19 10:26:36'; #使用时间来删除二进制日志 Query OK, 0 rowsaffected (0.05 sec) 4、mysql 用户管理 1、用户登录 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 mysql –h 110.110.110.110 –u root –p 123 本地可以直接 mysql –u root -p 美河学习在线 www.eimhe.com 2、用户退出 exit、quit 3、添加用户 mysql.user 表保存的是用户的登录信息 1. 直接添加无权限 insert into mysql.user (host,user,password) values('%','jifei',PASSWORD('jifei')); 1. 添加并赋权 grant select on 数据库.* to '用户名'@'登录主机' identified by '密码'; 4、用户权限 1. 添加权限 grant 权限 on 数据库.表 to '用户名'@'登录主机'; 权限: select ,update,delete,insert(表数据)、create,alert,drop(表结构)、references(外 键)、create temporary tables(创建临时表)、index(操作索引)、create view,show view(视 图)、create routine,alert routine,execute(存储过程)、all,all privileges(所有权限) 数据库:数据库名或者*(所有数据库) 表:表名或者*(某数据库下所有表) 主机:主机名或者%(任何其他主机) 例:grant selec,insert,update,delete on *.* to 'jifei'@'%'; 1. 撤销权限 revoke 权限 on 数据库.表 from '用户名'@'登录主机';//将 to 改为 from 例:revoke all on *.* from ‘jifei’@’%’; 1. 查看权限 show grants;//自己 show grants for dba@localhost;//指定用户指定 host 美河学习在线 www.eimhe.com 5、删除用户 delete from mysql.user where user='' and host=''; delete from mysql.user where user='slave' and host='192.168.0.24'; flush privileges; 6、修改密码 update mysql.user set password=PASSWORD('111111') where user='root'; 7、找回密码操作 1. 关闭 mysql 服务 killall -TERM mysqld 1. 修改配置文件 vi /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock skip-grant-tables 1. 重启 mysqld service mysqld restart 1. 登录 mysql -uroot -p 1. 修改密码 update mysql.user set password=PASSWORD('111111') where user='root'; flush privileges;//刷新权限 美河学习在线 www.eimhe.com 1. 修改配置文件 vi /etc/my.cnf 去掉之前的改动 1. 重启服务 2. 设置远程用户 8、远程用户 ① 限制在指定 ip 登录 host 为 ip 详情请看 添加权限 ② 在任意远程 ip 登录 host 为%详情请看 添加权限 1. 远程访问 mysql -h110.110.110.110 -uroot -p123;//指定 h 为 ip 详情请看 用户登录 一些标准实例: 1. mysql.user 表实例:一般来说,Host 字段都使用 ip 来限制,而不是机器名(机器名可变, 不是特别靠谱) select Host, User from user; | 172.17.% | dev | | 172.17.0.% | export | | 172.17.0.20 | demo | | 172.28.0.% | dev | | 192.168.% | dev | | 110.111.126.% | demo | | 110.111.126.103 | helper | | 110.111.127.% | webnav | | localhost | backup | | localhost | backupdata | | localhost | root | +-----------------+-----------------+ 2. 授权实例:show grants for 'helper'@'110.111.127.%' +----------------------------------------------------------------------------------------- ---------------------------------------------------------+ 美河学习在线 www.eimhe.com | GRANT USAGE ON *.* TO 'helper'@'110.111.127.%' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx' WITH MAX_USER_CONNECTIONS 200 | | GRANT ALL PRIVILEGES ON `helper_online`.* TO 'helper'@'110.111.127.%' | +--------------------------------------------------------------------------------- 5、mysql 默认数据库 1、information_schema 大家在安装或使用 MYSQL 时,会发现除了自己安装的数据库以外,还有一个 information_schema 数据库。information_schema 数据库是做什么用的呢,使用 WordPress 博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章后, 你就会对 information_schema 数据库有所了解。 information_schema 数据库是 MySQL 自带的,它提供了访问数据库元数据的方式。什 么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权 限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。 在 MySQL 中,把 information_schema 看作是一个数据库,确切说是信息数据库。其 中保存着关于 MySQL 服务器所维护的所有其他数据库的信息。如数据库名,数据库的 表,表栏的数据类型与访问权限等。在 INFORMATION_SCHEMA 中,有数个只读表。 它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。 information_schema 数据库表说明: SCHEMATA 表:提供了当前 mysql 实例中所有数据库的信息。是 show databases 的 结果取之此表。 TABLES 表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个 schema,表类型,表引擎,创建时间等信息。是 show tables from schemaname 的 结果取之此表。 COLUMNS 表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是 show columns from schemaname.tablename 的结果取之此表。 STATISTICS 表:提供了关于表索引的信息。是 show index from schemaname.tablename 的结果取之此表。 USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自 mysql.user 授权表。是非标准表。 美河学习在线 www.eimhe.com SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信 息来自 mysql.db 授权表。是非标准表。 TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自 mysql.tables_priv 授权表。是非标准表。 COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自 mysql.columns_priv 授权表。是非标准表。 CHARACTER_SETS(字符集)表:提供了 mysql 实例可用字符集的信息。是 SHOW CHARACTER SET 结果集取之此表。 COLLATIONS 表:提供了关于各字符集的对照信息。 COLLATION_CHARACTER_SET_APPLICABILITY 表:指明了可用于校对的字符集。 这些列等效于 SHOW COLLATION 的前两个显示字段。 TABLE_CONSTRAINTS 表:描述了存在约束的表。以及表的约束类型。 KEY_COLUMN_USAGE 表:描述了具有约束的键列。 ROUTINES 表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES 表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于 INFORMATION_SCHEMA.ROUTINES 表的 mysql.proc 表列。 VIEWS 表:给出了关于数据库中的视图的信息。需要有 show views 权限,否则无法查 看视图信息。 TRIGGERS 表:提供了关于触发程序的信息。必须有 super 权限才能查看该表。 +---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLUMNS | | COLUMN_PRIVILEGES | | ENGINES | | EVENTS | | FILES | | GLOBAL_STATUS | | GLOBAL_VARIABLES | | KEY_COLUMN_USAGE | | PARAMETERS | | PARTITIONS | | PLUGINS | 美河学习在线 www.eimhe.com | PROCESSLIST | | PROFILING | | REFERENTIAL_CONSTRAINTS | | ROUTINES | | SCHEMATA | | SCHEMA_PRIVILEGES | | SESSION_STATUS | | SESSION_VARIABLES | | STATISTICS | | TABLES | | TABLESPACES | | TABLE_CONSTRAINTS | | TABLE_PRIVILEGES | | TRIGGERS | | USER_PRIVILEGES | | VIEWS | | INNODB_CMP_RESET | | INNODB_TRX | | INNODB_CMPMEM_RESET | | INNODB_LOCK_WAITS | | INNODB_CMPMEM | | INNODB_CMP | | INNODB_LOCKS | +---------------------------------------+ 2、mysql 这个是 mysql 的核心数据库,类似于 sql server 中的 master 表,主要负责存储数据库的用户、 权限设置、关键字等 mysql 自己需要使用的控制和管理信息。不可以删除,如果对 mysql 不 是很了解,也不要轻易修改这个数据库里面的表信息。 3、test 这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任 何表,可以删除。 美河学习在线 www.eimhe.com 4、performace_schema mysql 5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA 这个功能默认 是关闭的: 需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写 在 my.cnf 中 不能动态修改。 先看看有什么东西吧: mysql> use performance_schema; Database changed mysql> show tables ; +----------------------------------------------+ | Tables_in_performance_schema | +----------------------------------------------+ | cond_instances | | events_waits_current | | events_waits_history | | events_waits_history_long | | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_global_by_event_name | | file_instances | | file_summary_by_event_name | | file_summary_by_instance | | mutex_instances | | performance_timers | | rwlock_instances | | setup_consumers | | setup_instruments | | setup_timers | | threads | +----------------------------------------------+ 17 rows in set (0.00 sec) 这里的数据表分为几类: 1) setup table : 设置表,配置监控选项。 2) current events table : 记录当前那些 thread 正在发生什么事情。 3) history table 发生的各种事件的历史记录表 4) summary table 对各种事件的统计表 美河学习在线 www.eimhe.com 5) 杂项表,乱七八糟表。 setup 表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE 'setup%'; +-------------------+ | TABLE_NAME | +-------------------+ | setup_consumers | | setup_instruments | | setup_timers | +-------------------+ setup_consumers 描述各种事件 setup_instruments 描述这个数据库下的表名以及是否开启监控。 setup_timers 描述 监控选项已经采样频率的时间间隔 这个要多说一点 目前 performance-schema 只支持 'wait' 时间的监控,代码树上 wait/ 下的函数都可以监控到。 文档上说了只有 'wait' 事件的检测,有没有其他的选项呢? 看看源代码: static row_setup_timers all_setup_timers_data[COUNT_SETUP_TIMERS]= { { { C_STRING_WITH_LEN("wait") }, &wait_timer } }; THR_LOCK table_setup_timers::m_table_lock; int table_setup_timers::update_row_values(TABLE *table, const unsigned char *, unsigned char *, Field **fields) { Field *f; longlong value; DBUG_ASSERT(m_row); for (; (f= *fields) ; fields++) { 美河学习在线 www.eimhe.com if (bitmap_is_set(table->write_set, f->field_index)) { switch(f->field_index) { case 0: /* NAME */ my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0)); return HA_ERR_WRONG_COMMAND; case 1: /* TIMER_NAME */ value= get_field_enum(f); if ((value >= FIRST_TIMER_NAME) && (value <= LAST_TIMER_NAME)) *(m_row->m_timer_name_ptr)= (enum_timer_name) value; else return HA_ERR_WRONG_COMMAND; break; default: DBUG_ASSERT(false); } } } return 0; } 代码里写死了,只有 'wait' 一个值,不排除以后的版本会增加新的关键字,但至少目前就只 有一个啦。 并且这个表的 name 字段是不允许修改的的。 下面的修改的方法里没有做任何处理,涉及到 name 字段的修改,直接报错。 mysql> SELECT * FROM setup_timers; +------+------------+ | NAME | TIMER_NAME | +------+------------+ | wait | CYCLE | +------+------------+ 只有 timer_name 可以 update 这是一个 enum 字段。 性能事件表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%current'; +----------------------+ | TABLE_NAME | +----------------------+ 美河学习在线 www.eimhe.com | events_waits_current | +----------------------+ 记录当前正在发生的等待事件,这个表是只读的表,不能 update ,delete ,但是可以 truncate 具体字段是什么意思就自己去查 doc 了,这里不说了。 性能历史表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND (TABLE_NAME LIKE '%history' OR TABLE_NAME LIKE '%history_long'); +---------------------------+ | TABLE_NAME | +---------------------------+ | events_waits_history | | events_waits_history_long | +---------------------------+ 这些表与前面的性能表的结构是一致的, history 表只保留每个线程(thread) 的最近的 10 个事件, history_long 记录最近的 10000 个事件。 新事件如表,如果旧表满了,就会丢弃旧的数据,标准的先进先出(FIFO) 这俩表也是只读 表,只能 truncate 事件汇总表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%summary%'; +----------------------------------------------+ | TABLE_NAME | +----------------------------------------------+ | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_global_by_event_name | | file_summary_by_event_name | | file_summary_by_instance | +----------------------------------------------+ 按照相关的标准对进行的事件统计表, events_waits_summary_global_by_event_name 在 mysql5.5.7 以前叫: 美河学习在线 www.eimhe.com EVENTS_WAITS_SUMMARY_BY_EVENT_NAME 表也是只读的,只能 turcate performance schema instance 表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%instances'; +------------------+ | TABLE_NAME | +------------------+ | cond_instances | | file_instances | | mutex_instances | | rwlock_instances | +------------------+ 记录各种等待事件涉及到的实例 : 主要是 3 类: cond (容器? ) mutex (互斥 锁) ,rwlock (读写锁) 这表是只读的。 乱七八糟表: mysql> SELECT * FROM performance_timers; +-------------+-----------------+------------------+----------------+ | TIMER_NAME | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD | +-------------+-----------------+------------------+----------------+ | CYCLE | 2389029850 | 1 | 72 | | NANOSECOND | NULL | NULL | NULL | | MICROSECOND | 1000000 | 1 | 585 | | MILLISECOND | 1035 | 1 | 738 | | TICK | 101 | 1 | 630 | +-------------+-----------------+------------------+----------------+ 这个表式只读表,记录了事件采样频率的设定,我们前面说的 setup_timer 表的 timer_name 只能区这 4 个中一个。 mysql> SELECT * FROM threads; +-----------+----------------+----------------------------------------+ | THREAD_ID | PROCESSLIST_ID | NAME | +-----------+----------------+----------------------------------------+ | 0 | 0 | thread/sql/main | | 1 | 0 | thread/innodb/io_handler_thread | | 16 | 0 | thread/sql/signal_handler | | 23 | 7 | thread/sql/one_connection | 美河学习在线 www.eimhe.com | 5 | 0 | thread/innodb/io_handler_thread | | 12 | 0 | thread/innodb/srv_lock_timeout_thread | | 22 | 6 | thread/sql/one_connection | 这个表记录了系统里当前存在的各种线程。 下面就是 涉及到 performance_schema 的各个系统参数了: mysql> SHOW VARIABLES LIKE 'perf%'; +---------------------------------------------------+---------+ | Variable_name | Value | +---------------------------------------------------+---------+ | performance_schema | ON | | performance_schema_events_waits_history_long_size | 10000 | | performance_schema_events_waits_history_size | 10 | | performance_schema_max_cond_classes | 80 | | performance_schema_max_cond_instances | 1000 | | performance_schema_max_file_classes | 50 | | performance_schema_max_file_handles | 32768 | | performance_schema_max_file_instances | 10000 | | performance_schema_max_mutex_classes | 200 | | performance_schema_max_mutex_instances | 1000000 | | performance_schema_max_rwlock_classes | 30 | | performance_schema_max_rwlock_instances | 1000000 | | performance_schema_max_table_handles | 100000 | | performance_schema_max_table_instances | 50000 | | performance_schema_max_thread_classes | 50 | | performance_schema_max_thread_instances | 1000 | +---------------------------------------------------+---------+ 涉及到系统状态的参数: mysql> SHOW STATUS LIKE 'perf%'; +------------------------------------------+-------+ | Variable_name | Value | +------------------------------------------+-------+ | Performance_schema_cond_classes_lost | 0 | | Performance_schema_cond_instances_lost | 0 | | Performance_schema_file_classes_lost | 0 | | Performance_schema_file_handles_lost | 0 | | Performance_schema_file_instances_lost | 0 | | Performance_schema_locker_lost | 0 | | Performance_schema_mutex_classes_lost | 0 | | Performance_schema_mutex_instances_lost | 0 | | Performance_schema_rwlock_classes_lost | 0 | | Performance_schema_rwlock_instances_lost | 0 | | Performance_schema_table_handles_lost | 0 | 美河学习在线 www.eimhe.com | Performance_schema_table_instances_lost | 0 | | Performance_schema_thread_classes_lost | 0 | | Performance_schema_thread_instances_lost | 0 | +------------------------------------------+-------+ Live together,or Die alone! 5、performance_schema-详解 我们使用 mysql 5.5 也有一段时间了,对于 performance schema 引擎的使用问题, 一直没有开展起来,主要原因是资料太少。这段时间花了一些时间专门的关注了 一下,形成本文档: Mysql 5.5 版本是第一个版本,本文提到的部分数据可能不适用,其中包括了 mysql 5.6 的一些情况。 从数据库内部讲这些表关注了数据库的 4 个模块 分别是: 1. Mutex (互斥体,锁相关) 2. RWLOCKs (读写锁) 3. File I/O (文件 io) 4. Thread (线程) 包括了全部的 mutex 42 个, rwlocks 10 个,以及 6 种类型的线程(thread),文 件 io 在分为数据(data) , 日志(log),临时文件(temp file i/o) 。 Performance schema 记录的信息,比较底层,如果想深入的研究,需要对 mysql 的 internal 有一定的了解, 本篇,我们不关注源代码级的信息,仅从一个使用者 的角度来看,如何使用 performance schema 为数据库优化提供一些建议。 Performance schema 下面的表: mysql.cnt_it.sock@performance_schema> show tables ; +----------------------------------------------+ | Tables_in_performance_schema | +----------------------------------------------+ | cond_instances | | events_waits_current | | events_waits_history | | events_waits_history_long | | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_global_by_event_name | | file_instances | | file_summary_by_event_name | | file_summary_by_instance | | mutex_instances | | performance_timers | 美河学习在线 www.eimhe.com | rwlock_instances | | setup_consumers | | setup_instruments | | setup_timers | | threads | +----------------------------------------------+ 17 rows in set (0.00 sec) 这些表基本可以分为 4 部分 一类是 instance 表, Instance 表记录的是那种类型的对象被探测或者记录。 instance 表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%instances'; +------------------+ | TABLE_NAME | +------------------+ | cond_instances | | file_instances | | mutex_instances | | rwlock_instances | +------------------+ 记录各种等待事件涉及到的实例: 主要是 3 类: cond (容器? )mutex(互 斥锁) ,rwlock (读写锁) 这些表是只读的。 一类是 Setup 表 Setup 表记录了配置信息,以及监控的参数等等。 setup 表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE 'setup%'; +-------------------+ | TABLE_NAME | +-------------------+ | setup_consumers | | setup_instruments | | setup_timers | +-------------------+ setup_consumers 描述各种事件 setup_instruments 描述这个数据库下的表名以及是否开启监控。 setup_timers 描述监控选项已经采样频率的时间间隔 这个要多说一点目前 performance-schema 只支持'wait' 时间的监控,代码树 上 wait/ 下的函数都可以监控到。 文档上说了只有'wait' 事件的检测,有没有其他的选项呢? 美河学习在线 www.eimhe.com 看看源代码: static row_setup_timers all_setup_timers_data[COUNT_SETUP_TIMERS]= { { { C_STRING_WITH_LEN("wait") }, &wait_timer } }; THR_LOCK table_setup_timers::m_table_lock; int table_setup_timers::update_row_values(TABLE *table, const unsigned char *, unsigned char *, Field **fields) { Field *f; longlong value; DBUG_ASSERT(m_row); for (; (f= *fields) ; fields++) { if (bitmap_is_set(table->write_set, f->field_index)) { switch(f->field_index) { case 0: /* NAME */ my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0)); return HA_ERR_WRONG_COMMAND; case 1: /* TIMER_NAME */ value= get_field_enum(f); if ((value >= FIRST_TIMER_NAME) && (value <= LAST_TIMER_NAME)) *(m_row->m_timer_name_ptr)= (enum_timer_name) value; else return HA_ERR_WRONG_COMMAND; break; default: DBUG_ASSERT(false); } } } return 0; } 代码里写死了,只有'wait' 一个值,不排除以后的版本会增加新的关键字,但至 少目前就只有一个啦。 并且这个表的 name 字段是不允许修改的的。下面的修改的方法里没有做任何处 美河学习在线 www.eimhe.com 理,涉及到 name 字段的修改,直接报错。 mysql> SELECT * FROM setup_timers; +------+------------+ | NAME | TIMER_NAME | +------+------------+ | wait | CYCLE | +------+------------+ 只有 timer_name 可以 update 这是一个 enum 字段。 一类是 event 表 Event 表记录了各种事件,提供了当前事件(current) ,历史事件(history) 以 及 history_long 事件,history 表记录了每个线程的最近的 10 个事件,history_long 记录了 10000 个事件。这两个历史表都是先进先出(FIFO)的规则。 性能事件表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%current'; +----------------------+ | TABLE_NAME | +----------------------+ | events_waits_current | +----------------------+ 记录当前正在发生的等待事件,这个表是只读的表,不能 update ,delete ,但是 可以 truncate 具体字段是什么意思就自己去查 doc 了,这里不说了。 性能历史表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND (TABLE_NAME LIKE '%history' OR TABLE_NAME LIKE '%history_long'); +---------------------------+ | TABLE_NAME | +---------------------------+ | events_waits_history | | events_waits_history_long | +---------------------------+ 这些表与前面的性能表的结构是一致的, history 表只保留每个线程(thread) 的 最近的 10 个事件, history_long 记录最近的 10000 个事件。 新事件入表,如果旧表满了,就会丢弃旧的数据,标准的先进先出(FIFO) 这俩 表也是只读表,只能 truncate 还有一类是 summary 表 Summary 表是对 event 的统计数据。 事件汇总表: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' 美河学习在线 www.eimhe.com -> AND TABLE_NAME LIKE '%summary%'; +----------------------------------------------+ | TABLE_NAME | +----------------------------------------------+ | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_global_by_event_name | | file_summary_by_event_name | | file_summary_by_instance | +----------------------------------------------+ 按照相关的标准对进行的事件统计表, events_waits_summary_global_by_event_name 在 mysql5.5.7 以前叫: EVENTS_WAITS_SUMMARY_BY_EVENT_NAME 表也是只读的,只能 turcate 对于 performance schema 下的每个表的详细定义,以及字段的解读,请参考手册: http://dev.mysql.com/doc/refman/5.5/en/performance-schema-table-descriptions.html 大小写问题 另外一个问题,performance schema 库下的表,或字段名,在查询的时候,建议 全部小写, 原因是 5.5.5 以前是大写,导致在某些平台上 lower_case_table_names =1 出现问题,5.5.8 后全部改为小写字母。 启动设置问题 Performance schama 默认是不启用的,启动的参数为静态参数,需要在 my.cnf 里 设置 performance_schema=1,或者设定命令行参数。 当服务器启动起来的时候,会在 err 日志里记录一条信息: “100407 16:13:02 [Note] Buffered information: Performance schema enabled.” 如果是关闭的则会显示另外一个信息: “100407 16:13:02 [Note] Buffered information: Performance schema disabled (reason: start parameters)” 还有中情况,设置了参数但是 performance schema 启动失败,这种情况极少发生, 日志里的信息: “Performance schema disabled (reason: init failed)”, 启动失败情况下,performacne schema 会关闭自己,并且 mysql 数据库会继续启动,起结果就跟关闭启动参数是 一样的。 相应的系统参数: mysql.cnt_it.sock@performance_schema> show global variables like '%performance_schema%' ; +---------------------------------------------------+---------+ | Variable_name | Value | +---------------------------------------------------+---------+ | performance_schema | ON | | performance_schema_events_waits_history_long_size | 10000 | | performance_schema_events_waits_history_size | 10 | | performance_schema_max_cond_classes | 80 | | performance_schema_max_cond_instances | 1000 | 美河学习在线 www.eimhe.com | performance_schema_max_file_classes | 50 | | performance_schema_max_file_handles | 32768 | | performance_schema_max_file_instances | 10000 | | performance_schema_max_mutex_classes | 200 | | performance_schema_max_mutex_instances | 1000000 | | performance_schema_max_rwlock_classes | 30 | | performance_schema_max_rwlock_instances | 1000000 | | performance_schema_max_table_handles | 100000 | | performance_schema_max_table_instances | 50000 | | performance_schema_max_thread_classes | 50 | | performance_schema_max_thread_instances | 1000 | +---------------------------------------------------+---------+ 详解这些参数: http://dev.mysql.com/doc/refman/5.5/en/performance-schema-system-variables.html 参考 mysql 的官方文档。 对应的状态参数: mysql.cnt_house.sock@performance_schema> show global status like '%performance_schema%' ; +------------------------------------------+-------+ | Variable_name | Value | +------------------------------------------+-------+ | Performance_schema_cond_classes_lost | 0 | | Performance_schema_cond_instances_lost | 0 | | Performance_schema_file_classes_lost | 0 | | Performance_schema_file_handles_lost | 0 | | Performance_schema_file_instances_lost | 0 | | Performance_schema_locker_lost | 0 | | Performance_schema_mutex_classes_lost | 0 | | Performance_schema_mutex_instances_lost | 0 | | Performance_schema_rwlock_classes_lost | 0 | | Performance_schema_rwlock_instances_lost | 0 | | Performance_schema_table_handles_lost | 0 | | Performance_schema_table_instances_lost | 0 | | Performance_schema_thread_classes_lost | 0 | | Performance_schema_thread_instances_lost | 0 | +------------------------------------------+-------+ 14 rows in set (0.00 sec) 参数详解: http://dev.mysql.com/doc/refman/5.5/en/performance-schema-status-variables.html 这些状态值,显示的是因为内存吃紧,或者系统太忙,导致的一些没有 performance schema 记录下来的事件。 对于 performance schema 运行状态如何? 可以使用命令 show engine status 来看: mysql.cnt_house.sock@performance_schema> show engine performance_schema 美河学习在线 www.eimhe.com status \G *************************** 1. row *************************** Type: performance_schema Name: events_waits_current.row_size Status: 136 *************************** 2. row *************************** Type: performance_schema Name: events_waits_current.row_count Status: 3000 *************************** 3. row *************************** Type: performance_schema Name: events_waits_history.row_size Status: 120 *************************** 4. row *************************** Type: performance_schema Name: events_waits_history.row_count Status: 10000 *************************** 5. row *************************** Type: performance_schema Name: events_waits_history.memory Status: 1200000 *************************** 6. row *************************** Type: performance_schema Name: events_waits_history_long.row_size Status: 120 *************************** 7. row *************************** Type: performance_schema Name: events_waits_history_long.row_count Status: 10000 *************************** 8. row *************************** Type: performance_schema Name: events_waits_history_long.memory Status: 1200000 *************************** 9. row *************************** Type: performance_schema Name: (pfs_mutex_class).row_size Status: 248 *************************** 10. row *************************** Type: performance_schema Name: (pfs_mutex_class).row_count Status: 200 *************************** 11. row *************************** Type: performance_schema Name: (pfs_mutex_class).memory 美河学习在线 www.eimhe.com Status: 49600 *************************** 12. row *************************** Type: performance_schema Name: (pfs_rwlock_class).row_size Status: 296 *************************** 13. row *************************** Type: performance_schema Name: (pfs_rwlock_class).row_count Status: 30 *************************** 14. row *************************** Type: performance_schema Name: (pfs_rwlock_class).memory Status: 8880 *************************** 15. row *************************** Type: performance_schema Name: (pfs_cond_class).row_size Status: 216 *************************** 16. row *************************** Type: performance_schema Name: (pfs_cond_class).row_count Status: 80 *************************** 17. row *************************** Type: performance_schema Name: (pfs_cond_class).memory Status: 17280 *************************** 18. row *************************** Type: performance_schema Name: (pfs_thread_class).row_size Status: 136 *************************** 19. row *************************** Type: performance_schema Name: (pfs_thread_class).row_count Status: 50 *************************** 20. row *************************** Type: performance_schema Name: (pfs_thread_class).memory Status: 6800 *************************** 21. row *************************** Type: performance_schema Name: (pfs_file_class).row_size Status: 240 *************************** 22. row *************************** Type: performance_schema Name: (pfs_file_class).row_count 美河学习在线 www.eimhe.com Status: 50 *************************** 23. row *************************** Type: performance_schema Name: (pfs_file_class).memory Status: 12000 *************************** 24. row *************************** Type: performance_schema Name: mutex_instances.row_size Status: 136 *************************** 25. row *************************** Type: performance_schema Name: mutex_instances.row_count Status: 1000000 *************************** 26. row *************************** Type: performance_schema Name: mutex_instances.memory Status: 136000000 *************************** 27. row *************************** Type: performance_schema Name: rwlock_instances.row_size Status: 200 *************************** 28. row *************************** Type: performance_schema Name: rwlock_instances.row_count Status: 1000000 *************************** 29. row *************************** Type: performance_schema Name: rwlock_instances.memory Status: 200000000 *************************** 30. row *************************** Type: performance_schema Name: cond_instances.row_size Status: 88 *************************** 31. row *************************** Type: performance_schema Name: cond_instances.row_count Status: 1000 *************************** 32. row *************************** Type: performance_schema Name: cond_instances.memory Status: 88000 *************************** 33. row *************************** Type: performance_schema Name: threads.row_size 美河学习在线 www.eimhe.com Status: 504 *************************** 34. row *************************** Type: performance_schema Name: threads.row_count Status: 1000 *************************** 35. row *************************** Type: performance_schema Name: threads.memory Status: 504000 *************************** 36. row *************************** Type: performance_schema Name: file_instances.row_size Status: 624 *************************** 37. row *************************** Type: performance_schema Name: file_instances.row_count Status: 10000 *************************** 38. row *************************** Type: performance_schema Name: file_instances.memory Status: 6240000 *************************** 39. row *************************** Type: performance_schema Name: (pfs_file_handle).row_size Status: 8 *************************** 40. row *************************** Type: performance_schema Name: (pfs_file_handle).row_count Status: 32768 *************************** 41. row *************************** Type: performance_schema Name: (pfs_file_handle).memory Status: 262144 *************************** 42. row *************************** Type: performance_schema Name: events_waits_summary_by_thread_by_event_name.row_size Status: 48 *************************** 43. row *************************** Type: performance_schema Name: events_waits_summary_by_thread_by_event_name.row_count Status: 360000 *************************** 44. row *************************** Type: performance_schema Name: events_waits_summary_by_thread_by_event_name.memory 美河学习在线 www.eimhe.com Status: 17280000 *************************** 45. row *************************** Type: performance_schema Name: (pfs_table_share).row_size Status: 488 *************************** 46. row *************************** Type: performance_schema Name: (pfs_table_share).row_count Status: 50000 *************************** 47. row *************************** Type: performance_schema Name: (pfs_table_share).memory Status: 24400000 *************************** 48. row *************************** Type: performance_schema Name: (pfs_table).row_size Status: 72 *************************** 49. row *************************** Type: performance_schema Name: (pfs_table).row_count Status: 100000 *************************** 50. row *************************** Type: performance_schema Name: (pfs_table).memory Status: 7200000 *************************** 51. row *************************** Type: performance_schema Name: performance_schema.memory Status: 394468704 51 rows in set (0.00 sec) 三个命令: Show engine innodb status Show engine innodb mutex Show engine performacne_schema status 统计事件/对象可以分为几类: 1)wait/io io 等待事件 2)wait/io/file 文件 io 等待,一般是指等待文件操作完成。 3)wait/sync 等待同步对象,内容比较广泛,他的 time_wait 时间包括了, 请求对一个对象加锁,因为阻塞而导致的等待时间。 4)wait/sync/cond 主要用于线程间同步,引起的等待事件。 5)wait/sync/mutex 对资源访问的的互斥体的请求等待,mutex 对资源的 独占式访问,的一种锁结构。 6)wait/sync/rwlock 对变量访问、修改的锁等待。主意是对变量,主要用 于线程安全的变量访问。 美河学习在线 www.eimhe.com 这些表的上的操作限制: 对于 setup 表上,有些字段是可以 update 的,用于控制监控的开启关闭。 对于 event_wait_* 这样的表式可以 truncate 的,但是不能 delete, update。可以在特定的诊断任务开始前, 清空原来的数据。 对于 summary 的表,也可以执行 truncate 操作,但是只是把 summary 的统 计字段置 0 或者 null ,而不会删除里面的行记录。 用 performance schema 诊断性能问题的一般步骤: 1.运行测试 case 2.打开 performance schema 收集信息 3.排除没有干扰的因素,并关闭对应的收集器,例如确定 file i/o 不是问题的根本 原因则可以关闭 file io 收集,truncate event 表,然后从新收集性能数据。 4.重复 1-3, 越来越接近根本原因,也可以从 events_waits_history_long 表的统计分析,问题部分会越来越集中。 5.一旦确定了问题的原因,就可以着手解决问题,优化性能。 6.mutex_instances.LOCKED_BY_THREAD_ID 和 rwlock_instances.WRITE_LOCKED_BY_THREAD_ID 这两个字段对于发现性能瓶颈,或则死锁是非常重要的。 1) 假设 thread1 在等待某个 mutex 2) 那么可以看看 thread1 在等待什么资源。 SELECT * FROM events_waits_current WHERE THREAD_ID = thread_1; 根据其中的 OBJECT_INSTANCE_BEGIN 去关联 mutex_instances 表确 定是什么当前资源被那个线程占有, mysql.cnt_it.sock@performance_schema> SELECT * FROM mutex_instances where OBJECT_INSTANCE_BEGIN = 15806424; +------------------------------------+------------------ -----+---------------------+ | NAME | OBJECT_INSTANCE_BEGIN | LOCKED_BY_THREAD_ID | +------------------------------------+------------------ -----+---------------------+ | wait/synch/mutex/sql/LOG::LOCK_log | 15805160 | 1305458 | +------------------------------------+------------------ -----+---------------------+ 1 row in set (0.02 sec) 3)。我们就可以去看看这线程当前正在做什么。 mysql.cnt_it.sock@performance_schema> select * from events_waits_current where thread_id =1305458 \G *************************** 1. row *************************** THREAD_ID: 1305458 EVENT_ID: 76094 EVENT_NAME: 美河学习在线 www.eimhe.com wait/synch/cond/sql/MYSQL_BIN_LOG::update_cond SOURCE: log.cc:5535 TIMER_START: 8958895120369531348 TIMER_END: NULL TIMER_WAIT: NULL SPINS: NULL OBJECT_SCHEMA: NULL OBJECT_NAME: NULL OBJECT_TYPE: NULL OBJECT_INSTANCE_BEGIN: 15806424 NESTING_EVENT_ID: NULL OPERATION: timed_wait NUMBER_OF_BYTES: NULL FLAGS: 0 1 row in set (0.00 sec) 这是一个示例,我们测试环境,捕捉不到,我就拿了一个 bin log 的写线程。 Sql 示例: 1 等待事件的 top N mysql> SELECT EVENT_NAME, SUM(TIMER_WAIT), COUNT(*), SOURCE -> FROM EVENTS_WAITS_HISTORY_LONG -> WHERE EVENT_NAME LIKE “%innodb%” -> GROUP BY SOURCE -> ORDER BY SUM(TIMER_WAIT) DESC; 2 平均等待时间 top N : mysql> SELECT EVENT_NAME, SUM(TIMER_WAIT)/count(*), source -> FROM EVENTS_WAITS_HISTORY_LONG -> WHERE EVENT_NAME LIKE “%innodb%” -> GROUP BY source -> ORDER BY SUM(TIMER_WAIT) / COUNT(*) DESC; EVENTS_WAITS_HISTORY 每个线程 10 行记录, EVENTS_WAITS_HISTORY_LONG 表默认是 10000 行记录,如果认为尺寸不够 大,可以通过修改参数: “performance_schema_events_waits_history_size” “performance_schema_events_waits_history_long_size” 这两个变量来调整, history_long 表的最大尺寸是 100W 行记录。 3 最热的 mutex : 这里的时间单位是微秒(pico-second,或者说是 cpu 频率周期) mysql> SELECT EVENT_NAME, COUNT_STAR,SUM_TIMER_WAIT, AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE EVENT_NAME LIKE '%innodb%' order BY COUNT_STAR DESC; 从下面的结果,我们可以大体了解下,我们电脑网计数器的情况: Buff pool 和日志和 undo 是比较忙的,需要优化的。 美河学习在线 www.eimhe.com *************************** 1. row *************************** EVENT_NAME: wait/synch/mutex/innodb/kernel_mutex COUNT_STAR: 183768448476 SUM_TIMER_WAIT: 4527315253253694 AVG_TIMER_WAIT: 24635 *************************** 2. row *************************** EVENT_NAME: wait/synch/mutex/innodb/buf_pool_mutex COUNT_STAR: 15121853525 SUM_TIMER_WAIT: 3285302101091527 AVG_TIMER_WAIT: 217255 *************************** 3. row *************************** EVENT_NAME: wait/synch/mutex/innodb/log_sys_mutex COUNT_STAR: 7142949915 SUM_TIMER_WAIT: 1559525178971936 AVG_TIMER_WAIT: 218330 *************************** 4. row *************************** EVENT_NAME: wait/synch/mutex/innodb/log_flush_order_mutex COUNT_STAR: 6649384948 SUM_TIMER_WAIT: 691589270730534 AVG_TIMER_WAIT: 104008 *************************** 5. row *************************** EVENT_NAME: wait/synch/mutex/innodb/trx_undo_mutex COUNT_STAR: 3615217180 SUM_TIMER_WAIT: 112854228995684 AVG_TIMER_WAIT: 31216 PERFORMANCE SCHEMA 的性能问题: 这部分没有做过测试,数据来自网上 全部默认开启 performance schema 大约会有 8% 左右的性能消耗, 如果开启了 performance schema ,但是在 setup 表中关闭事件记录,大约 会有 4% 左右的性能损失。 我们的建议: 安装 mysql 的时候,开启 performance schema 参数, 并在 setup 表中关闭事件记录,这样便于在遇到严重问题,需要打开性能日志 的时候,需要重启 mysql 美河学习在线 www.eimhe.com 6、windows 下 mysql 操作 1、启动关闭 2、基本操作 1、root 用户设置密码 D:\>mysqladmin -u root password mysql123 2、登陆 mysql -u 用户名 [-h 主机名或者 IP 地址] -p 密码 D:\>mysql -uroot -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.6.10 MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 3、show databases; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) 美河学习在线 www.eimhe.com mysql> use mysql; Database changed mysql> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | ………… | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ 28 rows in set (0.02 sec) 7、mysql 从库安装配置 1、安装依赖的包 安装依赖的包,挂载光盘在光盘里面是有 rpm –ivh 安装,或者使用 yum 安装。mysql5.5 以 后是通过 cmake 来编译的,需要安装 cmake,可以 yum 安装,也可以编译安装。 编译安装 cmake: [root@ rbdb-cs local]#tar -zxvf cmake-2.8.7.tar.gz [root@ rbdb-cs local]#cd cmake-2.8.7 [root@ rbdb-cs cmake-2.8.7]#./configure [root@rbdb-cs cmake-2.8.7]# make && make install 如果报错了,可以重新 configure,然后执行 make && make install # 安装相关组件: yum -y install yum-fastestmirror yum -y install patch make flex bison tar yum -y install libtool libtool-libs kernel-devel yum -y install libjpeg libjpeg-devel libpng libpng-devel yum -y install libtiff libtiff-devel gettext gettext-devel yum -y install libxml2 libxml2-devel zlib-devel net-snmp yum -y install file glib2 glib2-devel bzip2 diff* openldap-devel 美河学习在线 www.eimhe.com yum -y install bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs yum -y install e2fsprogs-devel krb5 krb5-devel libidn libidn-devel yum -y install openssl openssl-devel vim-minimal unzip 或者 shell>yum install cmake --(mysql5.5 以后是通过 cmake 来编译的) shell>yum install ncurses-devel --Redhat 执行 cmake 是需要依赖的包,如缺少编译报错 shell>yum install bison-devel shell>yum install libaio-devel shell>yum install gcc-c++ 或者 yum -y install gcc gcc-c++ gcc-g77 autoconf automake zlib* fiex* libxml* ncurses- devel libmcrypt* libtool-ltdl-devel* make cmake 或者 (执行这个比较方便) yum -y install gcc gcc-c++ autoconf bison libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2- devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn- devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap- servers 2、创建安装用户 mysql [root@csdb24 ~]# groupadd mysql [root@csdb24 ~]# useradd -g mysql mysql [root@csdb24 ~]# id mysql uid=502(mysql) gid=504(mysql) 组=504(mysql) 3、创建目录-修改权限 //安装 mysql [root@csdb24 local]# mkdir -p /usr/local/mysql //存放数据 [root@csdb24 local]# mkdir -p /usr/local/mysql/data 美河学习在线 www.eimhe.com [root@csdb24 local]# chown -R mysql:mysql /usr/local/mysql 4、解压-编译安装 [root@csdb24 mysql]# pwd /usr/local/mysql [root@csdb24 mysql]# tar -zxvf mysql-5.6.12.tar.gz [root@csdb24 mysql]# ll 总用量 35044 drwxr-xr-x 2 mysql mysql 4096 3 月 27 11:29 data drwxr-xr-x 33 7161 wheel 4096 5 月 21 2013 mysql-5.6.12 -rw-r--r-- 1 mysql mysql 35876046 3 月 27 11:32 mysql-5.6.12.tar.gz 进入解压目录,然后执行编译。 cd mysql-5.6.12 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DINSTALL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DEXTRA_CHARSETS=all \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DMYSQL_USER=mysql \ -DMYSQL_TCP_PORT=3306 make && make install 或者 make -j 2 && make install //-j 指定几个 CPU 核心去编译 注意事项: 如安装失败重新编译时,需要清除旧的对象文件和缓存信息。 shell> make clean shell> rm -f CMakeCache.txt shell> rm -rf /etc/my.cnf 安装完成查看内容: 美河学习在线 www.eimhe.com [root@csdb24 mysql]# ll 总用量 32368 drwxr-xr-x 2 root root 4096 3 月 30 14:19 bin -rw-r--r-- 1 root root 17987 7 月 18 2014 COPYING drwxr-xr-x 3 mysql mysql 4096 3 月 30 14:19 data drwxr-xr-x 2 root root 4096 3 月 30 14:19 docs drwxr-xr-x 3 root root 4096 3 月 30 14:19 include -rw-r--r-- 1 root root 88927 7 月 18 2014 INSTALL-BINARY drwxr-xr-x 3 root root 4096 3 月 30 14:19 lib drwxr-xr-x 4 root root 4096 3 月 30 14:19 man drwxr-xr-x 35 7161 wheel 4096 3 月 30 14:19 mysql-5.6.20 -rw-r--r-- 1 root root 32979820 3 月 27 22:38 mysql-5.6.20.tar.gz drwxr-xr-x 10 root root 4096 3 月 30 14:19 mysql-test -rw-r--r-- 1 root root 2496 7 月 18 2014 README drwxr-xr-x 2 root root 4096 3 月 30 14:19 scripts drwxr-xr-x 28 root root 4096 3 月 30 14:19 share drwxr-xr-x 4 root root 4096 3 月 30 14:19 sql-bench drwxr-xr-x 2 root root 4096 3 月 30 14:19 support-files 5、安装完成后查看 1、查看安装目录情况 [root@rbdb-cs mysql]# ls bin docs lib mysql-5.6.20 README sql- bench COPYING include man mysql-5.6.20.tar.gz scripts support- files data INSTALL-BINARY mysql-5.6.12.tar.gz mysql-test share 2、data 目录情况 [root@rbdb-cs mysql]# cd data/ [root@rbdb-cs data]# ls test 安装完成后,在/etc 目录下面生产了一个 my.cnf 文件,这个文件的参数不是规划的参数,所 以需要修改这个参数文件,如下: [root@rbdb-cs etc]# pwd /etc [root@rbdb-cs etc]# ls -l|grep my -rw-r--r--. 1 root root 251 10 月 12 2013 my.cnf [root@rbdb-cs etc]# cat my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock 美河学习在线 www.eimhe.com user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 6、注册服务 进入安装目录下的 support-files 文件夹: [root@csdb24 support-files]# pwd /usr/local/mysql/support-files [root@csdb24 support-files]# ll 总用量 32 -rwxr-xr-x 1 root root 1153 3 月 30 14:08 binary-configure -rw-r--r-- 1 root root 773 7 月 18 2014 magic -rw-r--r-- 1 root root 1126 3 月 30 14:08 my-default.cnf -rwxr-xr-x 1 root root 1061 3 月 30 14:08 mysqld_multi.server -rwxr-xr-x 1 root root 894 3 月 30 14:08 mysql-log-rotate -rwxr-xr-x 1 root root 10880 3 月 30 14:08 mysql.server 使用默认配置文件 [root@csdb24 support-files]# cp my-default.cnf /etc/my.cnf cp:是否覆盖"/etc/my.cnf"? y [root@csdb24 support-files]# 注册服务: [root@csdb24 support-files]# cp mysql.server /etc/rc.d/init.d/mysql 修改执行权限 [root@csdb24 init.d]# pwd /etc/rc.d/init.d [root@csdb24 init.d]# ls -l|grep my -rw-r--r-- 1 root root 10880 3 月 27 16:55 mysql [root@csdb24 init.d]# [root@csdb24 init.d]# [root@csdb24 init.d]# chmod +x mysql [root@csdb24 init.d]# ls -l|grep my -rwxr-xr-x 1 root root 10880 3 月 27 16:55 mysql 美河学习在线 www.eimhe.com 设置开机启动 [root@csdb24 mysql]# chkconfig --add mysql [root@csdb24 mysql]# chkconfig mysql on 修改安装目录权限: [root@csdb24 mysql]# chown -R mysql:mysql /usr/local/mysql/ 7、初始化数据库 mysql_install_db --basedir=/usr/local/mysql --datadir=//usr/local/mysql/data/ --user=mysql -- defaults-file=/usr/local/mysql/my.cnf 或者添加--tmpdir ./mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql -- defaults-file=/usr/local/mysql/my.cnf --tmpdir=/tmp [root@csdb24 scripts]# pwd /usr/local/mysql/scripts [root@csdb24 scripts]# ll 总用量 36 -rwxr-xr-x 1 root root 34544 3 月 30 14:08 mysql_install_db [root@csdb24 scripts]# ./mysql_install_db --basedir=/usr/local/mysql -- datadir=/usr/local/mysql/data/ --user=mysql --defaults-file=/usr/local/mysql/my.cnf Installing MySQL system tables...2015-03-30 14:30:02 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-30 14:30:02 16780 [Note] InnoDB: Using atomics to ref count buffer pool pages 2015-03-30 14:30:02 16780 [Note] InnoDB: The InnoDB memory heap is disabled 2015-03-30 14:30:02 16780 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2015-03-30 14:30:02 16780 [Note] InnoDB: Memory barrier is not used 2015-03-30 14:30:02 16780 [Note] InnoDB: Compressed tables use zlib 1.2.3 2015-03-30 14:30:02 16780 [Note] InnoDB: Using Linux native AIO 2015-03-30 14:30:02 16780 [Note] InnoDB: Using CPU crc32 instructions 2015-03-30 14:30:02 16780 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2015-03-30 14:30:02 16780 [Note] InnoDB: Completed initialization of buffer pool 2015-03-30 14:30:02 16780 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! 2015-03-30 14:30:02 16780 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB 2015-03-30 14:30:02 16780 [Note] InnoDB: Database physically writes the file full: wait... 2015-03-30 14:30:02 16780 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB 2015-03-30 14:30:03 16780 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB 2015-03-30 14:30:03 16780 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0 美河学习在线 www.eimhe.com 2015-03-30 14:30:03 16780 [Warning] InnoDB: New log files created, LSN=45781 2015-03-30 14:30:03 16780 [Note] InnoDB: Doublewrite buffer not found: creating new 2015-03-30 14:30:03 16780 [Note] InnoDB: Doublewrite buffer created 2015-03-30 14:30:03 16780 [Note] InnoDB: 128 rollback segment(s) are active. 2015-03-30 14:30:03 16780 [Warning] InnoDB: Creating foreign key constraint system tables. 2015-03-30 14:30:03 16780 [Note] InnoDB: Foreign key constraint system tables created 2015-03-30 14:30:03 16780 [Note] InnoDB: Creating tablespace and datafile system tables. 2015-03-30 14:30:03 16780 [Note] InnoDB: Tablespace and datafile system tables created. 2015-03-30 14:30:03 16780 [Note] InnoDB: Waiting for purge to start 2015-03-30 14:30:03 16780 [Note] InnoDB: 5.6.20 started; log sequence number 0 2015-03-30 14:30:03 16780 [Note] Binlog end 2015-03-30 14:30:03 16780 [Note] InnoDB: FTS optimize thread exiting. 2015-03-30 14:30:03 16780 [Note] InnoDB: Starting shutdown... 2015-03-30 14:30:05 16780 [Note] InnoDB: Shutdown completed; log sequence number 1625977 OK Filling help tables...2015-03-30 14:30:05 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-03-30 14:30:05 16802 [Note] InnoDB: Using atomics to ref count buffer pool pages 2015-03-30 14:30:05 16802 [Note] InnoDB: The InnoDB memory heap is disabled 2015-03-30 14:30:05 16802 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2015-03-30 14:30:05 16802 [Note] InnoDB: Memory barrier is not used 2015-03-30 14:30:05 16802 [Note] InnoDB: Compressed tables use zlib 1.2.3 2015-03-30 14:30:05 16802 [Note] InnoDB: Using Linux native AIO 2015-03-30 14:30:05 16802 [Note] InnoDB: Using CPU crc32 instructions 2015-03-30 14:30:05 16802 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2015-03-30 14:30:05 16802 [Note] InnoDB: Completed initialization of buffer pool 2015-03-30 14:30:05 16802 [Note] InnoDB: Highest supported file format is Barracuda. 2015-03-30 14:30:05 16802 [Note] InnoDB: 128 rollback segment(s) are active. 2015-03-30 14:30:05 16802 [Note] InnoDB: Waiting for purge to start 2015-03-30 14:30:05 16802 [Note] InnoDB: 5.6.20 started; log sequence number 1625977 2015-03-30 14:30:05 16802 [Note] Binlog end 2015-03-30 14:30:05 16802 [Note] InnoDB: FTS optimize thread exiting. 2015-03-30 14:30:05 16802 [Note] InnoDB: Starting shutdown... 2015-03-30 14:30:07 16802 [Note] InnoDB: Shutdown completed; log sequence number 1625987 OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: 美河学习在线 www.eimhe.com /usr/local/mysql/bin/mysqladmin -u root password 'new-password' /usr/local/mysql/bin/mysqladmin -u root -h csdb24 password 'new-password' Alternatively you can run: /usr/local/mysql/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd . ; /usr/local/mysql/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl Please report any problems at http://bugs.mysql.com/ The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com WARNING: Found existing config file /usr/local/mysql/my.cnf on the system. Because this file might be in use, it was not replaced, but was used in bootstrap (unless you used --defaults-file) and when you later start the server. The new default config file was created as /usr/local/mysql/my-new.cnf, please compare it with your file and take the changes you need. WARNING: Default config file /etc/my.cnf exists on the system This file will be read by default by the MySQL server If you do not want to use this, either remove it, or use the --defaults-file argument to mysqld_safe when starting the server 出现这样的日志信息,表示安装成功。 初始化数据库完成后,在 data 目录下面出现了数据文件。 美河学习在线 www.eimhe.com [root@rbdb-cs data]# ls auto.cnf ib_logfile0 mysql rbdb-cs.err test ibdata1 ib_logfile1 performance_schema rbdb-cs.pid 8、启动 mysql 服务 [root@csdb24 mysql]# service mysql start Starting MySQL.[确定] [root@csdb24 mysql]# netstat -lanp |grep 3306 tcp 0 0 :::3306 :::* LISTEN 16999/mysqld [root@csdb24 mysql]# ps -ef|grep mysql root 16884 1 0 14:55 pts/3 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe - -datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/csdb24.pid mysql 16999 16884 1 14:55 pts/3 00:00:00 /usr/local/mysql/bin/mysqld -- basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/csdb24.err --pid- file=/usr/local/mysql/data/csdb24.pid root 17032 14541 0 14:56 pts/3 00:00:00 grep mysql 9、配置安装环境变量 对 root 用户进行环境变量设置。 [root@csdb24 ~]# vi .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib export PATH ".bash_profile" 14L, 230C written [root@csdb24 ~]# source .bash_profile 美河学习在线 www.eimhe.com 10、设置 root 用户密码及打开远程连接 [root@csdb24 ~]# mysql -u root mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.20 Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql Database changed mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; Query OK, 0 rows affected (0.00 sec) mysql> update user set Password = password('root') where User='root'; Query OK, 4 rows affected (0.00 sec) Rows matched: 5 Changed: 4 Warnings: 0 mysql> select Host,User,Password from user where User='root'; +-----------+------+-------------------------------------------+ | Host | User | Password | +-----------+------+-------------------------------------------+ | localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | csdb24 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | 127.0.0.1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | ::1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | % | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-----------+------+-------------------------------------------+ 5 rows in set (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 美河学习在线 www.eimhe.com 使用密码登陆: [root@csdb24 ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.6.20 Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 11、安装目录结构 安装目录/usr/local/mysql/下的目录结构 Directory Contents of Directory bin Client programs and the mysqld server data Log files, databases docs Manual in Info format man Unix manual pages include Include (header) files lib Libraries scripts mysql_install_db share Miscellaneous support files, including error messages, sample configuration files, SQL for database installation sql-bench Benchmarks 美河学习在线 www.eimhe.com 8、mysql 主从复制配置 http://369369.blog.51cto.com/319630/790921/ http://database.51cto.com/art/201111/304473.htm http://www.cnblogs.com/zgx/archive/2011/09/13/2174823.html http://blog.sina.com.cn/s/blog_4c197d420100w7uz.html http://www.jb51.net/article/50053.htm http://www.open-open.com/lib/view/open1373874692544.html#_label5 http://www.open-open.com/doc/view/ead2be6efb664a22862c8511a5a30623 http://www.open-open.com/doc/view/b60640f86b414201a3290f0380b83317 http://www.open-open.com/doc/view/72f287ef98774022b58fa45e8378175c http://my.oschina.net/zijian1315/blog/202599 http://my.oschina.net/zijian1315/blog/204553 MySQL 的 Replication 是一个异步的复制过程,从一个 MySQL instace(我们称之为 Master)复制 到另一个 MySQL instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要 由三个线程来完成,其中两个线程(Sql 线程和 IO 线程)在 Slave 端,另外一个线程(IO 线程) 在 Master 端。 要实现 MySQL 的 Replication ,首先必须打开 Master 端的 Binary Log(MySQL-bin.xxxxxx)功能, 否则无法实现。因为整个复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己 身上完全顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启 动 MySQL Server 的 过 程 中 使 用 “ — log-bin ” 参 数 选 项 , 或 者 在 my.cnf 配置文件中 的 MySQLd 参数组([MySQLd]标识后的参数部分)增加“log-bin” 参数项。 MySQL 复制的基本过程如下: 1. Slave 上面的 IO 线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的 日志)之后的日志内容; 2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取 指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含 的信息之外,还包括本次返回 的 信 息 在 Master 端的 Binary Log 文 件 的 名 称 以 及 在 BinaryLog 中的位置; 3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的 RelayLog 文件 (MySQL-relay-bin.xxxxxx)的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的高速 Master“我需要从某个 bin-log 的哪个位置开始往后的日志内容,请发给我” 4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成 为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样, 实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。 二、设置 MySQL 主从配置的优点 美河学习在线 www.eimhe.com 1、解决 web 应用系统,数据库出现的性能瓶颈,采用数据库集群的方式来实现查询负载; 一个系统中数据库的查询操作比更新操作要多得多,通过多台查询服务器将数据库的查询分 担到不同的查询服务器上从而提高查询效率。 2、MySQL 数据库支持数据库的主从复制功能,使用主数据库进行数据的插入、删除与更新 操作,而从数据库则专门用来进行数据查询操作,这样可以将更新操作和查询操作分担到不 同的数据库上,从而提高了查询效率。 三、设置主从复制条件 1、主从 myslq 版本必须一致; 2、必须开启二进制日志; 1、修改主 my.cnf 参数 增加如下参数: server-id =24 log_bin = binlog/binlog log_bin_index = binlog/binlog.index binlog_format = ROW sync_binlog = 1 expire_logs_days = 7 server-id=24 中的 24 可以任定义,只要是唯一的就行(值是 1 到 2^32-1 之间的正整数), 然后重启 mysql 服务。 主从复制的其他参数: log-bin=mysql-bin server-id=1 innodb_flush_log_at_trx_commit=1 sync_binlog=1 binlog-do-db=wordpress binlog_ignore_db=mysql log-bin=mysql-bin:主从复制必须开启二进制日志,log-bin 参数必须配置,进行开启二进制 日志; server-id=1:中的 1 可以任定义,只要是唯一的就行; binlog-do-db=wordpress:是表示只备份 wordpress; binlog_ignore_db=mysql:表示忽略备份 mysql; 不加 binlog-do-db 和 binlog_ignore_db,那就表示备份全部数据库。 特别说明: log-bin――设置二进制日志文件的基本名; log-bin-index 设置二进制日志索引文件名。 binlog_format――控制二进制日志格式,进而控制了复制类型,三个可选值, STATEMENT:语句复制,类似 Oracle 的逻辑 DG; ROW:行复制,类似 Oracle 的物理 DG; MIXED:混和复制,默认选项。为避免出现主从数据不一致,建议将其修改为 ROW。 server-id――为服务器设置唯一 ID,默认为 1,推荐取 IP 最后部分; 美河学习在线 www.eimhe.com sync-binlog――默认为 0,为保证不会丢失数据,需设置为 1,用于强制每次提交事务时,同 步二进制日志到磁盘上。 注:这几个参数是必须的,其他更多参数请参考相关文档 2、添加复制用户 创建专门用于复制的用户(建议这样做),从服务器采用该帐户登陆主服务器。如果你计划从 从属服务器主机使用 LOAD TABLE FROM MASTER 或 LOAD DATA FROM MASTER 语 句,你需要授予该账户其它权限: 授予账户 SUPER 和 RELOAD 全局权限。 为所有想要装载的表授予 SELECT 权限。任何该 账户不能 SELECT 的主服务器上的表被 LOAD DATA FROM MASTER 忽略掉。 在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。 在下面的命令,把 X.X.X.X 替换为从服务器的 IP。 mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.39' IDENTIFIED BY 'slave'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.39' IDENTIFIED BY 'slave'; Query OK, 0 rows affected (0.00 sec) 如果有多个从库,ip 地址可以使用通配符表示。 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%' IDENTIFIED BY 'slave'; 3、进行数据库同步 1、主库导出 把主数据库导入到从数据库进行同步,执行导出之前进行只读锁定,不允许修改,导出后解 除锁定,最后查看 master 主库的状态,记住显示信息,配置从库会用到。 mysql> flush tables with read lock; Query OK, 0 rows affected (0.01 sec) mysqldump -u root -p root --all-databases --lock-tables=false -- > /db112/all.sql [root@csdb24 ~]# mysqldump -u root -p root --all-databases --lock-tables=false -- > /db112/all.sql [root@csdb24 ~]# cd /db112/ [root@csdb24 db112]# ls -lh 总用量 359M 美河学习在线 www.eimhe.com -rw-r--r-- 1 root root 203 7 月 13 16:37 all.sql -rw-r--r-- 1 root root 5.5M 3 月 26 17:41 cmake-2.8.7.tar.gz -rw-r--r-- 1 root root 177M 3 月 26 20:27 mysql-5.5.41-linux2.6-x86_64.tar.gz -rw-r--r-- 1 root root 34M 3 月 26 17:43 mysql-5.6.11.tar.gz -rw-r--r-- 1 root root 35M 3 月 26 20:57 mysql-5.6.12.tar.gz -rw-r--r-- 1 root root 22M 4 月 16 2014 MySQL-client-5.6.10-1.rhel5.x86_64.rpm -rw-r--r-- 1 root root 85M 4 月 16 2014 MySQL-server-5.6.10-1.rhel5.x86_64.rpm -rw-r--r-- 1 root root 2.3M 4 月 16 2014 MySQL-shared-5.6.10-1.rhel5.x86_64.rpm -rw-r--r--. 1 oracle oinstall 13K 5 月 19 2014 oracleasmlib-2.0.4-1.el6.x86_64.rpm -rw-r--r--. 1 oracle oinstall 74K 5 月 19 2014 oracleasm-support-2.1.8-1.el6.x86_64.rpm -rw-r--r--. 1 oracle oinstall 93K 6 月 25 2014 rlwrap-0.41-1.el6.x86_64.rpm 2、查看主库日志位置 mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000007 | 330 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 3、从库导入 4、修改从库 my.cnf 添加 server-id = 39 的内容,然后重启 mysql 服务。 (server-id 必须和 master 的 ID 不同。若有多个 slave,则每个 slave 都必须有唯一的 id。) log-bin = binlog/binlog binlog_format = row log-slave-updates = 1 美河学习在线 www.eimhe.com server-id = 39 relay-log = mysql-relay-bin relay-log-index = mysql-relay-bin.index read-only = 1 slave_net_timeout =10 说明: 1)relay-log――设置中继日志文件基本名;relay-log-index 设置中继日志索引文件名。 2) read-only――设置 Slave 为只读,但具有 super 权限的用户仍然可写,MHA 要求设置为 1; 3)log-slave-updates――该参数用来控制 Slave 上的更新是否写入二进制日志,默认为 0;若 Slave 只作为从服务器,则不必启用;若 Slave 作为其他服务器的 Master,则需启用,启用时 需和 log-bin、binlog-format 一起使用,这样 Slave 从主库读取日志并重做,然后记录到自己 的二进制日志中。 4)slave_net_timeout――设置网络超时时间,即多长时间测试一下主从是否连接,默认为 3600 秒,即 1 小时,这个值在生产环境过大,我们将其修改为 10 秒,即若主从中断 10 秒, 则触发重新连接动作 5、创建从库 slave 服务 1、创建 slave 服务 创建 slave 服务,然后启动。 change master to master_host='192.168.0.24',master_user='slave',master_password='slave',MASTER_PORT=3306, master_log_file='binlog.000007',master_log_pos=330,MASTER_CONNECT_RETRY=10; MASTER_HOST:主库服务器的 IP 或者主机名,主机名需要在 hosts 文件配置; report_host:从库服务器的 IP 或者主机名,主机名需要在 hosts 文件配置; MASTER_USER:配置主服务器时建立的用户名 MASTER_PASSWORD:用户密码 MASTER_PORT:主服务器 mysql 端口,如果未曾修改,默认即可; MASTER_LOG_FILE:是 show master status 查看主库的 file 的值; MASTER_LOG_POS:是 show master status 查看主库 Position 的值; master_connect_retry=60:若 master 宕机或者 slave 连接断开,slave 会定期尝试连接到 master 上,重试的间隔由该选项来控制,默认值是 60 秒; slave_net_timeout=3600:slave 默认会在 3600 秒后,若还没收到来自 master 的数据,则会 当作网络断开的情况来处理; mysql> change master to master_host='192.168.0.24',master_user='slave',master_password='slave',MASTER_PORT=3306, 美河学习在线 www.eimhe.com master_log_file='binlog.000007',master_log_pos=330,MASTER_CONNECT_RETRY=10; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> mysql> start slave; Query OK, 0 rows affected (0.00 sec) 2、参数选项 MASTER_BIND = 'interface_name' | MASTER_HOST = 'host_name' | MASTER_USER = 'user_name' | MASTER_PASSWORD = 'password' | MASTER_PORT = port_num | MASTER_CONNECT_RETRY = interval | MASTER_RETRY_COUNT = count | MASTER_DELAY = interval | MASTER_HEARTBEAT_PERIOD = interval | MASTER_LOG_FILE = 'master_log_name' | MASTER_LOG_POS = master_log_pos | MASTER_AUTO_POSITION = {0|1} | RELAY_LOG_FILE = 'relay_log_name' | RELAY_LOG_POS = relay_log_pos | MASTER_SSL = {0|1} | MASTER_SSL_CA = 'ca_file_name' | MASTER_SSL_CAPATH = 'ca_directory_name' | MASTER_SSL_CERT = 'cert_file_name' | MASTER_SSL_CRL = 'crl_file_name' | MASTER_SSL_CRLPATH = 'crl_directory_name' | MASTER_SSL_KEY = 'key_file_name' | MASTER_SSL_CIPHER = 'cipher_list' | MASTER_SSL_VERIFY_SERVER_CERT = {0|1} | IGNORE_SERVER_IDS = (server_id_list) server_id_list: [server_id [, server_id] ... ] 1、MASTER_HEARTBEAT_PERIOD 在 MySQL 的复制协议里,由 Slave 发送一个 COM_BINLOG_DUMP 命令后,就完全由 Master 来推送数据,Master、Slave 之间不再需要交互。如果 Master 没有更新,也就不会 美河学习在线 www.eimhe.com 有数据流,Slave 就不会收到任何数据包。但是如果由于某种原因造成 Master 无法把数据 发送到 Slave ,比如发生过网络故障或其他原因导致 Master 上的 TCP 连接丢失,由于 TCP 协议的特性,Slave 没有机会得到通知,所以也没法知道收不到数据是因为 Master 本来就 没有更新呢还是由于出了故障。 好在 MySQL 5.5 开始增加了一个复制心跳的功能。 如 复制代码 代码如下: stop slave; change master to master_heartbeat_period = 10; set global slave_net_timeout = 25; start slave; 就会让 Master 在没有数据的时候,每 10 秒发送一个心跳包。这样 Slave 就能知道 Master 是不是还正常。slave_net_timeout 是设置在多久没收到数据后认为网络超时,之后 Slave 的 IO 线程会重新连接 Master 。结合这两个设置就可以避免由于网络问题导致的复制延误。 master_heartbeat_period 单位是秒,可以是个带上小数,如 10.5。最高精度为 1 毫秒。 slave_net_timeout 的默认是 3600,也就是一小时。也就是说,在之前的情况下,Slave 要延 误 1 小时后才会尝试重连。而在没有设置 master_heartbeat_period 时,将 slave_net_timeout 设得很短会造成 Master 没有数据更新时频繁重连。 很奇怪的是,当前的 master_heartbeat_period 值无法通过 show slave status 查看,而要使 用 show status like ‘Slave_heartbeat_period' 查看。此外,状态变量 Slave_last_heartbeat 表 示最后一次收到心跳的时间,Slave_received_heartbeats 表示总共收到的心跳次数。 如: 复制代码 代码如下: mysql> show status like 'slave%'; +----------------------------+---------------------+ | Variable_name | Value | +----------------------------+---------------------+ | Slave_heartbeat_period | 5.000 | | Slave_last_heartbeat | 2014-05-08 11:48:57 | | Slave_open_temp_tables | 0 | 美河学习在线 www.eimhe.com | Slave_received_heartbeats | 1645 | | Slave_retried_transactions | 0 | | Slave_running | O N | +----------------------------+---------------------+ 6 rows in set (0.00 sec) 3、日志检查 查看从库 mysql 的一般普通日志,可以看到下面内容,有错误和警告,意思是开始的日志文 件不能找到,不能进行同步,执行 show slave status 命令,也可以看到这个错误,这个是因 为创建 slave 时候,日志文件的参数写错了,所以有这个结果。停止 slave(stop slave 命令) 后,修改正确参数,重新创建 slave,可以看到正确的日志。 mysql> show slave status\G 命令查看 查看 Slave_IO_Running、Slave_SQL_Running 状态都为 Yes 则表明设置成功,一定是都为 YES 状态,才是成功的,可以根据这个监控主从复制。 PS: Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件 Slave_SQL_Running:读取本地日志文件,并执行日志里的 SQL 命令 1、错误日志 [root@rbdb-cs data]# pwd /usr/local/mysql/data [root@rbdb-cs data]# cat rbdb-cs.err 2015-07-13 11:32:18 4450 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='192.168.0.24', master_port= 3306, master_log_file='mysql-bin.000004', master_log_pos= 330, master_bind=''. 2015-07-13 11:32:47 4450 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. 2015-07-13 11:32:47 4450 [Warning] Slave SQL: If a crash happens this configuration does not 美河学习在线 www.eimhe.com guarantee that the relay log info will be consistent, Error_code: 0 2015-07-13 11:32:47 4450 [Note] Slave SQL thread initialized, starting replication in log 'mysql- bin.000004' at position 330, relay log './rbdb-cs-relay-bin.000001' position: 4 2015-07-13 11:32:47 4450 [Note] Slave I/O thread: connected to master 'slave@192.168.0.24:3306',replication started in log 'mysql-bin.000004' at position 330 2015-07-13 11:32:47 4450 [ERROR] Error reading packet from server: Could not find first log file name in binary log index file ( server_errno=1236) 2015-07-13 11:32:47 4450 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file', Error_code: 1236 2015-07-13 11:32:47 4450 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000004', position 330 mysql> show slave status; +----------------+--------------+-------------+-------------+---------------+------------------+---------------------+------ --------------------+---------------+-----------------------+------------------+-------------------+-----------------+------- --------------+--------------------+------------------------+-------------------------+-----------------------------+--------- ---+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+- -------------------+--------------------+--------------------+-----------------+-------------------+----------------+-------- ---------------+-------------------------------+---------------+--------------------------------------------------------------- --------------------------------------------------------------------+----------------+----------------+------------------------ -----+------------------+--------------------------------------+-----------------------------------+-----------+-------------- -------+-----------------------------------------------------------------------------+--------------------+-------------+----- --------------------+--------------------------+----------------+--------------------+--------------------+------------------- +---------------+ | Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Master_Server_Id | Master_UUID | Master_Info_File | SQL_Delay | SQL_Remaining_Delay | Slave_SQL_Running_State | Master_Retry_Count | Master_Bind | Last_IO_Error_Timestamp | Last_SQL_Error_Timestamp | Master_SSL_Crl | Master_SSL_Crlpath | Retrieved_Gtid_Set | Executed_Gtid_Set | Auto_Position | +----------------+--------------+-------------+-------------+---------------+------------------+---------------------+------ | | 192.168.0.24 | slave | 3306 | 10 | mysql- bin.000004 | 330 | rbdb-cs-relay-bin.000001 | 4 | mysql- bin.000004 | No | Yes | | | | | | 美河学习在线 www.eimhe.com | 0 | | 0 | 330 | 120 | None | | 0 | No | | | | | | NULL | No | 1236 | Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' | 0 | | | 24 | b9b6c0b8- d6a9-11e4-bff8-0050568ad276 | /usr/local/mysql/data/master.info | 0 | NULL | Slave has read all relay log; waiting for the slave I/O thread to update it | 86400 | | 150713 11:32:47 | | | | | | 0 | +----------------+--------------+-------------+-------------+---------------+------------------+---------------------+------ 1 row in set (0.00 sec) 2、正确日志 2015-07-13 11:50:03 4450 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='192.168.0.24', master_port= 3306, master_log_file='mysql-bin.000007', master_log_pos= 330, master_bind=''. New state master_host='192.168.0.24', master_port= 3306, master_log_file='binlog.000007', master_log_pos= 330, master_bind=''. 2015-07-13 11:50:09 4450 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. 2015-07-13 11:50:09 4450 [Warning] Slave SQL: If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0 2015-07-13 11:50:09 4450 [Note] Slave SQL thread initialized, starting replication in log 'binlog.000007' at position 330, relay log './rbdb-cs-relay-bin.000001' position: 4 2015-07-13 11:50:09 4450 [Note] Slave I/O thread: connected to master 'slave@192.168.0.24:3306',replication started in log 'binlog.000007' at position 330 mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.24 Master_User: slave Master_Port: 3306 Connect_Retry: 10 Master_Log_File: binlog.000007 Read_Master_Log_Pos: 330 Relay_Log_File: rbdb-cs-relay-bin.000002 Relay_Log_Pos: 280 美河学习在线 www.eimhe.com Relay_Master_Log_File: binlog.000007 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: 330 Relay_Log_Space: 455 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: 24 Master_UUID: b9b6c0b8-d6a9-11e4-bff8-0050568ad276 Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 美河学习在线 www.eimhe.com Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec) ERROR: No query specified 6、master.info/relay-log.info 文件 在从库的 datadir 目录下面会有 master.info、relay-log.info 两个主从库的参数信息文件,就是 在从库执行 show slave status;时显示的信息文件。 服务器认为 master.info 的优先级比配置文件 my.cnf 高, 第一次启动 slave 时,master.info 不存在,它从 my.cnf 中读取选项值,然后把它们保存在 master.info 中。 下次重启 slave 时,它只读取 master.info 的内容,而不会读取 my.cnf 中的选项值。 想要使用不同的选项值,可以删除 master.info 后重启 slave,或者使用 CHANGE MASTER TO 语句(推荐)重置选项值。 7、测试同步 1、主库操作 主库在 test 数据库新建表 test07,插入数据。 [root@csdb24 ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.6.20-log Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> use test; Database changed mysql> show tables; Empty set (0.00 sec) 美河学习在线 www.eimhe.com mysql> create table test07(name varchar(20),sex char(1)); Query OK, 0 rows affected (0.07 sec) mysql> insert into test07 values("duting","M"); Query OK, 1 row affected (0.00 sec) 2、从库操作 从库查询主库的操作是否同步过来。 [root@rbdb-cs data]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.6.20-log Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use test; 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 mysql> show table; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | test07 | +----------------+ 1 row in set (0.00 sec) mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | test07 | 美河学习在线 www.eimhe.com +----------------+ 1 row in set (0.00 sec) mysql> select * from test07; +--------+------+ | name | sex | +--------+------+ | duting | M | +--------+------+ 1 row in set (0.00 sec) mysql> 8、主从切换 1、正常切换-主备互换 http://www.xifenfei.com/1559.html 正常的切换过程如下 7 步,然后是详细的操作过程。 1、确保从服务器已经处理了中继日志中的所有语句。 mysql> STOP SLAVE IO_THREAD。 2、然后检查 SHOW PROCESSLIST 语句的输出,直到你看到 Has read all relay log。当从服务器 都执行完这些,它们可以被重新配置为一个新的设置。 3、在被提升为主服务器的从服务器上,发出 STOP SLAVE 和 RESET MASTER 和 RESET SLAVE 操作。 4、在提升为主服务器的从服务器上(新的主服务器)创建用户 grant replication slave on *.* torepdcs@'IP of A' identified by 'replpwd'; grant allprivileges on *.* to 'repdcs'@'IP' identified by replpwd; 5、然后重启 mysql 服务。 6、在主服务器上 RESET MASTER。 然后 CHANGE MASTER TO MASTER_HOST='10.1.1.4',MASTER_USER='rep_slave',MASTER_PASSWORD='userpassword'; 7、检查切换状态:show slave status \G; http://www.xifenfei.com/1559.html 美河学习在线 www.eimhe.com 1、修改配置文件 read-only=1(主库) #read-only=1(备库) 2、查询从库状态 mysql> show processlist ; +—-+————-+———–+——+———+——+—————————————————— ———————–+——————+ | Id | User | Host | db | Command | Time | State | Info | +—-+————-+———–+——+———+——+—————————————————— ———————–+——————+ | 1 | root | localhost | ecp | Query | 0 | NULL | show processlist | | 4 | system user | | NULL | Connect | 2 | Waiting for master to send event | NULL | | 5 | system user | | NULL | Connect | 2 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | +—-+————-+———–+——+———+——+—————————————————— ———————–+——————+ 3 rows in set (0.00 sec) mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.2 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 107 Relay_Log_File: replicate.000007 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000004 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: 美河学习在线 www.eimhe.com Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 549 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: 2 1 row in set (0.00 sec) 3、查询主库状态 mysql> show processlist; +—-+——+——————-+——+————-+——+———————————————— ———————–+——————+ | Id | User | Host | db | Command | Time | State | Info | +—-+——+——————-+——+————-+——+———————————————— ———————–+——————+ | 1 | root | localhost | ecp | Query | 0 | NULL | show processlist | | 2 | repl | 192.168.1.4:17948 | NULL | Binlog Dump | 6 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | +—-+——+——————-+——+————-+——+———————————————— ———————–+——————+ 2 rows in set (0.00 sec) mysql> show master status \G *************************** 1. row *************************** 美河学习在线 www.eimhe.com File: mysql-bin.000004 Position: 107 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec) 4、从库操作 mysql> STOP SLAVE IO_THREAD; Query OK, 0 rows affected (0.04 sec) mysql> SHOW PROCESSLIST; +—-+————-+———–+——+———+——+—————————————————— ———————–+——————+ | Id | User | Host | db | Command | Time | State | Info | +—-+————-+———–+——+———+——+—————————————————— ———————–+——————+ | 1 | root | localhost | ecp | Query | 0 | NULL | SHOW PROCESSLIST | | 5 | system user | | NULL | Connect | 256 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | +—-+————-+———–+——+———+——+—————————————————— ———————–+——————+ 2 rows in set (0.00 sec) 确保状态为:has read all relay log mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.2 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 107 Relay_Log_File: replicate.000007 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: No Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: 美河学习在线 www.eimhe.com Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 549 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: NULL 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: 2 1 row in set (0.00 sec) 5、查询主库状态 mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000004 Position: 107 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec) 6、从库变主库 mysql> STOP SLAVE; Query OK, 0 rows affected (0.00 sec) 美河学习在线 www.eimhe.com mysql> RESET MASTER; Query OK, 0 rows affected (0.02 sec) mysql> RESET SLAVE; Query OK, 0 rows affected (0.03 sec) mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000001 Position: 107 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec) 7、主库变从库 mysql> RESET MASTER; Query OK, 0 rows affected (0.06 sec) mysql> RESET SLAVE; Query OK, 0 rows affected (0.03 sec) mysql> CHANGE MASTER TO -> MASTER_HOST=’192.168.1.4′, -> MASTER_USER=’repl’, -> MASTER_PASSWORD=’xifenfei’, -> MASTER_LOG_FILE=’mysql-bin.000001′, -> MASTER_LOG_POS=107; Query OK, 0 rows affected (0.05 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) 8、重启主和从库 [root@localhost mysql]# service mysql restart Shutting down MySQL….[ OK ] Starting MySQL…………….[ OK ] 9、检查主从是否都正常 主库 SHOW PROCESSLIST; show master status \G 从库 SHOW PROCESSLIST; start slave; show slave status \G 美河学习在线 www.eimhe.com 2、主库宕机切换 需要登陆从库 mysql,停止从库的 io_thread 线程,不在接收主库的日志,然后查看从库接收 过来的日志是否全部执行,如果执行完成,最后停止从库 slave 服务,进行重置。 1、确认从服务器已经完成所有同步操作 stop slave io_thread; show processlist; 直到看到状态都为:xxx has read all relay log 表示更新都执行完毕。 2、停止从服务器 slave 服务 stop slave; 3、将从服务器切换为主服务器 reset master; 9、取消主从复制 1、检查主从同步完成; 2、从库停止 slave,然后重置 slave、master; 3、主库重置 master、slave; 4、删除复制用户。 1、从库操作 mysql> stop slave io_thread; Query OK, 0 rows affected (0.08 sec) mysql> show processlist; +----+-------------+-----------+------+---------+---------+----------------------------------------------------------------- ------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+------+---------+---------+----------------------------------------------------------------- ------------+------------------+ | 8 | system user | | NULL | Connect | 1102437 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | | 16 | root | localhost | NULL | Query | 0 | init | show processlist | +----+-------------+-----------+------+---------+---------+----------------------------------------------------------------- 美河学习在线 www.eimhe.com ------------+------------------+ 2 rows in set (0.00 sec) mysql> show processlist\G; --检查同步完成 2、从库操作-停止 slave mysql> stop slave; Query OK, 0 rows affected (0.03 sec) mysql> reset slave; Query OK, 0 rows affected (0.01 sec) mysql> reset master; Query OK, 0 rows affected (0.04 sec) 3、主库操作 mysql> reset slave; Query OK, 0 rows affected (0.01 sec) mysql> reset master; Query OK, 0 rows affected (0.04 sec) 4、主库删除复制用户 delete from mysql.user where user='slave' and host='192.168.0.24'; flush privileges; 9、主从复制监控 shell 1、此脚本应该能适应各种各样不同的内外网环境,即 IP 不同的环境; 2、让脚本也顺便监控下 MySQL 是否正常运行; 3、并且每次出问题时将确切日期写进错误日志,方便事后排查原因。 记得在每台 MySQL 从机上分配一个 yuhongchun 的用户,权限大些也没关系,只限定在本地 运行,如下所示: grant all privileges on *.* to 'yuhongchun'@'127.0.0.1' identified by 'yuhongchun101'; grant all privileges on *.* to 'yuhongchun'@'localhost' identified by 'yuhongchun101'; #!/bin/bash #check MySQL_Slave Status #crontab time 00:10 MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'` 美河学习在线 www.eimhe.com MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'` STATUS=$(/usr/local/webserver/mysql/bin/mysql -u yuhongchun -pyuhongchun101 -S /tmp/mysql.sock -e "show slave status\G" | grep -i "running") IO_env=`echo $STATUS | grep IO | awk ' {print $2}'` SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'` if [ "$MYSQLPORT" == "3306" ] then echo "mysql is running" else mail -s "warn!server: $MYSQLIP mysql is down" yuhongchun027@163.com fi if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ] then echo "Slave is running!" else echo "####### $date #########">> /data/data/check_mysql_slave.log echo "Slave is not running!" >> /data/data/check_mysql_slave.log mail -s "warn! $MySQLIP_replicate_error" yuhongchun027@163.com << /data/data/check_mysql_slave.log fi 10、mysql 的 MHA 配置 http://my.oschina.net/zijian1315/blog/204440 http://www.2cto.com/database/201407/319748.html http://os.51cto.com/art/201307/401702_all.htm http://www.360doc.com/content/14/0214/16/15801732_352490449.shtml http://www.cnblogs.com/wingsless/p/4033093.html http://ylw6006.blog.51cto.com/470441/1568853/ http://www.cnblogs.com/yuanermen/p/3726572.html?utm_source=tuicool http://www.cnblogs.com/yuanermen/p/3726961.html http://www.cnblogs.com/yuanermen/p/3735263.html http://www.cnblogs.com/kissdb/p/4009620.html 美河学习在线 www.eimhe.com 1、MHA 原理 MHA,即 Master High Availability Manager and Tools for MySQL,是日本的一位 MySQL 专 家采用 Perl 语言编写的一个脚本管理工具,该工具仅适用于 MySQL Replication(二层)环境, 目的在于维持 Master 主库的高可用性。 学习一个高可用小软件,不但要熟悉其功能,还要了解其架构及工作原理。 1. 架构 从架构上来说,MHA 分为如下两大部分: (1) Node 我们知道,MHA 是基于 MySQL Replication 环境的,在该环境中,不管是 Master 角色, 还是 Slave 角色,都称为 Node,是被监控管理的对象节点。 Node 服务器上需要安装 MHA Node 包。 (2) Manager Manager 为 MHA 架构中的管理者,建议部署在一台独立的服务器上,当然也可部署在 某个 Slave 上,但该 Slave 永远不要被选择成为新的 Master,否则故障切换后的 MHA 架构就 失去了高可用性。 Manager 服务器需要安装 MHA Manager 包,并完善一个主配置文件。 一个 Manager 可管理多套 MySQL Replication 环境。 2. 工作原理 相较于其它 HA 软件,MHA 的目的在于维持 MySQL Replication 中 Master 库的高可用性, 其最大特点是可以修复多个 Slave 之间的差异日志,最终使所有 Slave 保持数据一致,然后 从中选择一个充当新的 Master,并将其它 Slave 指向它。 基本工作流程大致如下: (1) Manager 定期监控 Master,监控时间间隔由参数 ping_interval 决定,缺省为 3 秒 钟一次;可利用其自身的监控功能,也可调用第三方软件来监控;MHA 自身提供了两种监 控方式:SELECT(执行 SELECT 1)和 CONNECT(创建连接/断开连接),由于参数 ping_type 决 定,缺省为 SELECT 方式。 (2) 当监测到 Master 故障时,调用 SSH 脚本对所有 Node 执行一次检查,包括如下 几个方面: ――MySQL 实例是否可以连接; ――Master 服务器是否可以 SSH 连通; ――检查 SQL Thread 的状态; ――检查哪些 Server 死掉了,哪些 Server 是活动的,以及活动的 Slave 实例; ――检查 Slave 实例的配置及复制过滤规则; ――最后退出监控脚本并返回代表特殊意义代码。 (3) 开始 Master 故障切换,包括如下几个子阶段: ――Phase 1: Configuration Check Phase 在这个阶段,若某个 Slave 实例的 SQL Thread 停止了,则会自动启动它;并再次确认活 美河学习在线 www.eimhe.com 动的 Servers 及 Slaves。 ――Phase 2: Dead Master Shutdown Phase 在这个阶段,首先调用 master_ip_failover_script,若 HA 是基于 VIP 实现的,则关闭 VIP, 若是基于目录数据库实现的,则修改映射记录。 然后调用 shutdown_script 脚本强制关闭主机,以避免服务重启时,发生脑裂。 ――Phase 3: Master Recovery Phase 又包括如下 3 个子阶段: Phase 3.1: Getting Latest Slaves Phase 检查各个 Slave,获取最近的和最旧的 binary log file 和 position,并检查各个 Slave 成为 Master 的优先级,依赖于 candidate_master、no_master、[server_xxx]顺序、binary log 差异 量等因素。 Phase 3.2: Saving Dead Master's Binlog Phase 若 dead master 所在服务器依然可以通过 SSH 连通,则提取 dead master 的 binary log, 提取日志的起点就是上一步获取的最新的 binary log file 和 position,直到最后一条事件日志, 并在 dead master 本地的工作目录(由参数 remote_workdir 决定)中创建文件保存这些提取 到的日志,然后将该文件拷贝到 Manager 服务器的工作目录下(由参数 manager_workdir 决 定)。 当然,若 dead master 系统就无法连接,也就不存在差异的 binary log 了。 另外,MHA 还要对各个 Slave 节点进行健康检查,主要是 SSH 连通性。 Phase 3.3: Determining New Master Phase 接下来调用 apply_diff_relay_logs 命令恢复 Slave 的差异日志,这个差异日志指的是各个 Slave 之间的 relay log。 恢复完成后,所有的 Slave 数据是一致的,此时就可以根据优先级选择 New Master 了。 Phase 3.3: New Master Diff Log Generation Phase 这里是生成 dead master 和 new master 之间的差异日志,即将 Phase 3.2 保存的 binary log 拷贝到 New Master 的工作目录中(remote_workdir)。 Phase 3.4: Master Log Apply Phase 将上一步拷贝的差异日志恢复到 New Master 上,若发生错误,也可手动恢复。 然后获取 New Master 的 binlog name 和 position,以便其它 Slave 从这个新的 binlog name 和 position 开始复制。 最后会开启 New Master 的写权限,即将 read_only 参数设置为 0。 ――Phase 4: Slaves Recovery Phase Phase 4.1: Starting Parallel Slave Diff Log Generation Phase 生成 Slave 与 New Slave 之间的差异日志,并将该日志拷贝到各 Slave 的工作目录下,这 部分日志 dead master 和 new master 之间差异的那部分日志,因为各个 Slave 在 Phase 3.3 阶 段已经同步了。 Phase 4.2: Starting Parallel Slave Log Apply Phase 在各个 Slave 上应用这部分差异日志,然后通过 CHANGE MASTER TO 命令将这些 Slave 指向新的 New Master,最后开始复制(start slave)。 ――Phase 5: New master cleanup phase 清理 New Master 其实就是重置 slave info,即取消原来的 Slave 信息。 至此整个 Master 故障切换过程完成。 美河学习在线 www.eimhe.com 3. 功能 从官方网站的介绍来看,MHA 具有如下几个功能: (1) Master 自动监控和故障转移 基于现有的 MySQL 主从复制环境,MHA 可以监控 Master,当发现其故障时,自动进行 切换。 在多个 Slave 环境中,如果个别 Slave 没有接受到最新的 relay log events,MHA 则会自 动从最新的那个 Slave 上查找差异的 relay log events,并将这些差异事件应用到有延迟的 Slave 上,最终保持所有的 Slave 数据一致。通常情况下,MHA 可在 9-12 秒内监测到 Master 故障, 7-10 秒内关闭主机以避免脑裂,然后花费几秒时间应用差异的 relay log,整个过程通常只需 10-30 秒即可完成。 既然 MHA 可以自动修复多个 Slaves 之间的差异日志,所以不用担心数据一致性问题。 当 Master 故障时,MHA 会从多个 Slave 中随机选择一个充当新的 Master;当然,也可在配 置文件中指定某一个 Slave 优先成为 Master。 (2) 互动(手动)Master 故障转移 可以只使用 MHA 的故障转移功能,而不监控 Master,当其故障时,手动调用 MHA 来 进行故障切换。 (3)非交互式自动故障转移 MHA 还支持非交互式的 Master 故障切换(不监控 Master,但实现自动故障切换),这 个特性其实是将 Master 的监控和 VIP 接管交给第三方工具来做,比如 Heartbeat,MHA 只负 责 Master 故障转移和 Slave 之间的数据同步。 (4) 在线切换 Master 到不同的主机 在有些情况下,比如更换 Raid 控制器,升级主机硬件等,则需要将其上的 Master 实例 迁移到其它主机上,MHA 支持快速的 Master 切换和短暂的写操作阻塞,通常只需 0.5-2 秒 的 downtime,这是可以接受的,也方便了 DBA 的操作。 2、MHA 架构搭建-2 节点+Manager http://ylw6006.blog.51cto.com/470441/890360/ http://www.cnblogs.com/yuanermen/p/3726961.html http://os.51cto.com/art/201307/401702_all.htm 主节点:192.168.0.24 从节点:192.168.0.39 管理节点:192.168.0.20 #master 1 192.168.0.24 csdb24 csdb24.localdomain #slave 1 192.168.0.39 rbdb-cs rbdb-cs.localdomain #manager 美河学习在线 www.eimhe.com 192.168.0.20 devdbserver devdbserver.localdomain Mha 安装包下载地址: https://code.google.com/p/mysql-master-ha/downloads/list 1、修改 hosts 文件 #127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 127.0.0.1 localhost localhost.localdomain ::1 localhost6 localhost6.localdomain #master 1 192.168.0.24 csdb24 csdb24.localdomain #slave 1 192.168.0.39 rbdb-cs rbdb-cs.localdomain #manager 192.168.0.20 devdbserver devdbserver.localdomain 2、配置 ssh 互通 1、每个节点都执行 mkdir -p ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa 2、选择一个节点执行,比如 manager 节点(192.168.0.20) (1)对于本节点 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys (2)对于其他节点 ssh 192.168.0.24 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh 192.168.0.24 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys ssh 192.168.0.39 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh 192.168.0.39 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys (3)scp 到其他节点 scp ~/.ssh/authorized_keys 192.168.0.24:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys 192.168.0.39:~/.ssh/authorized_keys 美河学习在线 www.eimhe.com 3、测试,每个节点执行 [root@devdbserver ~]# ssh 192.168.0.20 date The authenticity of host '192.168.0.20 (192.168.0.20)' can't be established. RSA key fingerprint is 53:7d:b5:38:5b:83:9d:e3:36:b6:92:ac:06:c2:5c:ac. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.0.20' (RSA) to the list of known hosts. 2015 年 07 月 28 日 星期二 15:57:16 CST [root@devdbserver ~]# ssh 192.168.0.20 date 2015 年 07 月 28 日 星期二 15:57:18 CST [root@devdbserver ~]# ssh 192.168.0.24 date 2015 年 07 月 28 日 星期二 15:57:22 CST [root@devdbserver ~]# ssh 192.168.0.39 date 2015 年 07 月 28 日 星期二 09:51:59 CST 3、安装 MHA 包 MHA 的安装包也包括 Manager 和 Node 两部分,其中 Node 包不但要在所有的 Node 节点上 安装,而且还需在 Manager 节点上安装,因为 Manager 模块内部依赖 Node 模块, Manager 包则只需在 Manager 节点安装即可。 下载下面两个包: mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm 1、安装依赖包体 在安装这两个包之前,需要安装一些依赖的包体,如下所示,在安装一下包体的过程中,比 如 perl-Parallel-ForkManager,会有提示“No package perl-Parallel-ForkManager available”,表 示该 yum 源没有这个包后者名称错误,这个时候可以使用 wget 命令进行下载到本地,在进 行安装。 1、在数据库节点,只安装 node 包,需要的依赖包少些,只安装如下包体即可: yum install perl-DBI yum install perl-DBD-MySQL yum install perl-Time-HiRes yum install perl-IO-Socket-SSL 2、在 manager 节点,需要安装 node 和 manager 包体,需要安装如下包体: yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl- Config-IniFiles ncftp perl-Params-Validate perl-CPAN perl-Test-Mock-LWP.noarch perl-LWP- Authen-Negotiate.noarch perl-devel yum -y install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker 美河学习在线 www.eimhe.com yum -y install perl-Log-Dispatch yum -y install perl-base perl-MIME-Lite perl-Mail-Sendmail perl-Mail-Sender perl-Sys-Syslog yum -y install perl-DBI perl-Time-HiRes perl-IO-Socket-SSL perl-Parallel-ForkManager 这些包中有 perl-Mail-Sendmail、perl-Mail-Sende、perl-Parallel-ForkManager、perl-Log-Dispatch [root@devdbserver mha]# wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-Mail-Sender- 0.8.16-3.el6.noarch.rpm -P /db112/mha [root@devdbserver mha]# wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-Mail-Sendmail- 0.79-12.el6.noarch.rpm -P /db112/mha [root@devdbserver mha]# wget http://downloads.naulinux.ru/pub/NauLinux/6x/i386/sites/School/RPMS/perl-Log-Dispatch- 2.27-1.el6.noarch.rpm -P /db112/mha [root@devdbserver mha]# wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-Parallel- ForkManager-0.7.9-1.el6.noarch.rpm -P /db112/mha [root@devdbserver mha]# ll 总用量 180 -rw-r--r-- 1 root root 71564 1 月 26 2012 perl-Log-Dispatch-2.27-1.el6.noarch.rpm -rw-r--r-- 1 root root 55224 7 月 4 2010 perl-Mail-Sender-0.8.16-3.el6.noarch.rpm -rw-r--r-- 1 root root 28448 7 月 4 2010 perl-Mail-Sendmail-0.79-12.el6.noarch.rpm -rw-r--r-- 1 root root 21740 8 月 9 2011 perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm 然后分别使用 rpm -ivh 进行安装。 shell> wget ftp://ftp.muug.mb.ca/mirror/centos/5.10/os/x86_64/CentOS/perl-5.8.8- 41.el5.x86_64.rpm shell> wget ftp://ftp.muug.mb.ca/mirror/centos/6.5/os/x86_64/Packages/compat-db43-4.3.29- 15.el6.x86_64.rpm shell> wget http://downloads.naulinux.ru/pub/NauLinux/6x/i386/sites/School/RPMS/perl-Log- Dispatch-2.27-1.el6.noarch.rpm shell> wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-Parallel-ForkManager-0.7.9- 1.el6.noarch.rpm shell> wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-Mail-Sender-0.8.16- 3.el6.noarch.rpm shell> wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-Mail-Sendmail-0.79- 12.el6.noarch.rpm shell> wget http://mirror.centos.org/centos/6/os/x86_64/Packages/perl-Time-HiRes-1.9721- 136.el6.x86_64.rpm 美河学习在线 www.eimhe.com 2、安装 mha 包体 mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm 在 node 数据库节点,只安装 mha4mysql-node-0.56-0.el6.noarch.rpm,在 manager 节点,需 要先安装 node 包体,再安装 manager 包体。 [root@devdbserver db112]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm Preparing... ########################################### [100%] 1:mha4mysql-manager ########################################### [100%] 3、源码方式安装 安装完成依赖的包体后,执行源码文件的解压,然后安装。 1. [root@dg53 tarbag]# tar -zxvpf mha4mysql-node-0.52.tar.gz - C ../software/ 2. [root@dg53 tarbag]# cd ../software/mha4mysql-node-0.52/ 3. [root@dg53 mha4mysql-node-0.52]# perl Makefile.PL 4. [root@dg53 mha4mysql-node-0.52]# make && make install 4、Manager/Node 管理命令 MHA 提供的命令工具包括 Manager 工具和 Node 工具,简单介绍如下: Manager 工具 /usr/bin/masterha_check_repl ――检查 MySQL Replication 是否正常; /usr/bin/masterha_conf_host ――添加或删除配置的 Server 信息; /usr/bin/masterha_master_switch ――用于手动 Master 切换; /usr/bin/masterha_check_ssh ――检查各个 Node 之间 SSH 登录是否正常; /usr/bin/masterha_manager ――开启 MHA /usr/bin/masterha_secondary_check ――检查多路由配置; /usr/bin/masterha_check_status ――检查 MHA 是否开启并正常运行; /usr/bin/masterha_master_monitor ――手动开启监控,启动 MHA 时会自动启动监控 /usr/bin/masterha_stop ――关闭 MHA Node 工具 /usr/bin/save_binary_logs ――保存和复制 master 的二进制日志; /usr/bin/apply_diff_relay_logs ――识别差异的中继日志事件并应用于其它 Slave; /usr/bin/filter_mysqlbinlog ――去除不必要的 Rollback 事件(MHA 已不再使用该工具); 美河学习在线 www.eimhe.com /usr/bin/purge_relay_logs ――清除中继日志(不会阻塞 SQL 线程); 备注:Node 端工具通常由 MHA Manager 的脚本触发调用,无需 DBA 操作。 4、搭建主从复制 根据规划,在 24、39 主机上搭建满足 MHA 的主从复制,对于 MHA 来说,搭建 MySQL Replication 需要注意以下几点: (1)read_only――从库参数,是否限制 Slave 实例为只读状态,缺省为 0,即不限制,MHA 要求设置为 1; (2)relay_log_purge――这个参数用于限制中继日志应用完之后是否删除,缺省为 1,即应 用完之后立即删除;在 MHA 中,Manager 就是通过这些日志来同步各个 Slave 之间的数据差 异的,所以必须设置为 0,即不删除中继日志; (3)log_bin――是否开启二进制日志,若某个 Slave 可能被选择成为新的 Master,则必须 开启;若某个 Slave 被限制永远不会成为新的 Master,可以不用开启。 1、修改主库 my.cnf 参数 增加如下参数(修改完成后重启 mysql): server-id =24 log_bin = binlog/binlog lon_bin_index = binlog/binlog.index binlog_format = ROW sync_binlog = 1 expire_logs_days = 7 relay_log_purge =0 server-id=24 中的 24 可以任定义,只要是唯一的就行(值是 1 到 2^32-1 之间的正整数), 然后重启 mysql 服务。 relay_log_purge――这个参数用于限制中继日志应用完之后是否删除,缺省为 1,即应用完 之后立即删除;在 MHA 中,Manager 就是通过这些日志来同步各个 Slave 之间的数据差异 的,所以必须设置为 0,即不删除中继日志。 主从复制的其他参数: log-bin=mysql-bin server-id=1 innodb_flush_log_at_trx_commit=1 sync_binlog=1 binlog-do-db=wordpress binlog_ignore_db=mysql log-bin=mysql-bin:主从复制必须开启二进制日志,log-bin 参数必须配置,进行开启二进制 日志; 美河学习在线 www.eimhe.com server-id=1:中的 1 可以任定义,只要是唯一的就行; binlog-do-db=wordpress:是表示只备份 wordpress; binlog_ignore_db=mysql:表示忽略备份 mysql; 不加 binlog-do-db 和 binlog_ignore_db,那就表示备份全部数据库。 特别说明: log-bin――设置二进制日志文件的基本名; log-bin-index 设置二进制日志索引文件名。 binlog_format――控制二进制日志格式,进而控制了复制类型,三个可选值, STATEMENT:语句复制,类似 Oracle 的逻辑 DG; ROW:行复制,类似 Oracle 的物理 DG; MIXED:混和复制,默认选项。为避免出现主从数据不一致,建议将其修改为 ROW。 server-id――为服务器设置唯一 ID,默认为 1,推荐取 IP 最后部分; sync-binlog――默认为 0,为保证不会丢失数据,需设置为 1,用于强制每次提交事务时,同 步二进制日志到磁盘上。 注:这几个参数是必须的,其他更多参数请参考相关文档 2、主库添加复制用户 创建专门用于复制的用户(建议这样做),从服务器采用该帐户登陆主服务器。如果你计划从 从属服务器主机使用 LOAD TABLE FROM MASTER 或 LOAD DATA FROM MASTER 语 句,你需要授予该账户其它权限: 授予账户 SUPER 和 RELOAD 全局权限。 为所有想要装载的表授予 SELECT 权限。任何该 账户不能 SELECT 的主服务器上的表被 LOAD DATA FROM MASTER 忽略掉。 在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。 在下面的命令,把 X.X.X.X 替换为从服务器的 IP。 mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.39' IDENTIFIED BY 'slave'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.39' IDENTIFIED BY 'slave'; Query OK, 0 rows affected (0.00 sec) 如果有多个从库,ip 地址可以使用通配符表示。 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%' IDENTIFIED BY 'slave'; flush privileges; 3、修改从库 my.cnf 参数 增加如下参数(修改完成后重启 mysql): server-id = 39 log_bin = binlog/binlog 美河学习在线 www.eimhe.com lon_bin_index = binlog/binlog.index binlog_format = ROW sync_binlog = 1 read_only = 1 slave_net_timeout =10 log_slave_updates =1 expire_logs_days = 7 relay_log_purge = 0 1)relay-log――设置中继日志文件基本名;relay-log-index 设置中继日志索引文件名。 2) read-only――设置 Slave 为只读,但具有 super 权限的用户仍然可写,MHA 要求设置为 1; 3)log-slave-updates――该参数用来控制 Slave 上的更新是否写入二进制日志,默认为 0;若 Slave 只作为从服务器,则不必启用;若 Slave 作为其他服务器的 Master,则需启用,启用时 需和 log-bin、binlog-format 一起使用,这样 Slave 从主库读取日志并重做,然后记录到自己 的二进制日志中。 4)slave_net_timeout――设置网络超时时间,即多长时间测试一下主从是否连接,默认为 3600 秒,即 1 小时,这个值在生产环境过大,我们将其修改为 10 秒,即若主从中断 10 秒, 则触发重新连接动作 5)relay_log_purge――这个参数用于限制中继日志应用完之后是否删除,缺省为 1,即应用 完之后立即删除;在 MHA 中,Manager 就是通过这些日志来同步各个 Slave 之间的数据差异 的,所以必须设置为 0,即不删除中继日志。 4、从库添加复制用户 因为这个从库有可能变为主库,也需要添加复制用户。如果有多个从库,ip 地址可以使用通 配符表示。 select * from mysql.user\G; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%' IDENTIFIED BY 'slave'; flush privileges; 5、查看主库日志位置 登录主库,执行 how master status;命令,记录日志文件名和位置(File|Position)。 [root@csdb24 ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.20-log Source distribution 美河学习在线 www.eimhe.com Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000003 | 120 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 6、创建从库 slave 服务 创建 slave 服务,然后启动。 change master to master_host='192.168.0.24',master_user='slave',master_password='slave',MASTER_PORT=3306, master_log_file='binlog.000007',master_log_pos=330,MASTER_CONNECT_RETRY=10; MASTER_HOST:主库服务器的 IP 或者主机名,主机名需要在 hosts 文件配置; report_host:从库服务器的 IP 或者主机名,主机名需要在 hosts 文件配置; MASTER_USER:配置主服务器时建立的用户名 MASTER_PASSWORD:用户密码 MASTER_PORT:主服务器 mysql 端口,如果未曾修改,默认即可; MASTER_LOG_FILE:是 show master status 查看主库的 file 的值; MASTER_LOG_POS:是 show master status 查看主库 Position 的值; master_connect_retry=60:若 master 宕机或者 slave 连接断开,slave 会定期尝试连接到 master 上,重试的间隔由该选项来控制,默认值是 60 秒; slave_net_timeout=3600:slave 默认会在 3600 秒后,若还没收到来自 master 的数据,则会 当作网络断开的情况来处理; mysql> change master to master_host='192.168.0.24',master_user='slave',master_password='slave',MASTER_PORT=3306, master_log_file='binlog.000003',master_log_pos=120,MASTER_CONNECT_RETRY=10; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; 美河学习在线 www.eimhe.com Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.24 Master_User: slave Master_Port: 3306 Connect_Retry: 10 Master_Log_File: binlog.000003 Read_Master_Log_Pos: 120 Relay_Log_File: rbdb-cs-relay-bin.000002 Relay_Log_Pos: 280 Relay_Master_Log_File: binlog.000003 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: 120 Relay_Log_Space: 455 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: 24 美河学习在线 www.eimhe.com Master_UUID: b9b6c0b8-d6a9-11e4-bff8-0050568ad276 Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it 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 1 row in set (0.00 sec) ERROR: No query specified 5、manager 节点配置 接下来就可以配置 MHA 配置文件了,只需在 Manager 服务器上操作;RPM 包安装时,缺省 不会生成该配置文件,可手动生成,也可从 MHA Manager 源码安装包中查找配置文件模板, 及一系列调用脚本。 1、创建 manager 目录 在 Node 上创建一个单独的工作目录,用于 remote_workdir 参数来存放相关日志文件,缺省 为/var/tmp,若未创建,MHA 也会自动创建,但这需要有创建权限。在所有数据库节点创建 该目录。 # mkdir -p /usr/local/mha/app1 在 Manager 上创建工作目录,用于 manager_workdir 参数,其中存放日志文件和一系列脚本 文件等。 # mkdir -p /usr/local/mha/app1 --manager_workdir 目录 # mkdir -p /etc/mha --存放 MHA 配置文件目录 [root@devdbserver app1]# mkdir -p /usr/local/mha/app1 [root@devdbserver mha]# mkdir -p /etc/mha 美河学习在线 www.eimhe.com 2、修改配置文件 1、masterha_default.cnf 文件 这是全局配置文件,缺省为/etc/masterha_default.cnf,适用于一个 Manager 管理多套 MySQL Replication 的情况,在[server_default]下定义一些多套复制环境通用的 Global Scope 类 型的参数。本例只有一套 MySQL Replication,所以也可不用配置该文件,而是在对应的应用 配置文件(appl.conf)下的[server_default]中定义相关参数。 执行 MHA 相关命令时,会在/etc 目录下搜索该配置文件,若找不到,虽然不会有什么 错误,但会给出一个警告,如“[warning] Global configuration file /etc/masterha_default.cnf not found.”。为此可以在/etc 目录下创建一个名为 masterha_default.cnf 的空文件。 也可以配置一些通用的[server_default]类参数,如下: # vi /etc/masterha_default.cnf [server default] user = root password = mysql --mysql 密码 ssh_user = root repl_user = repl repl_password = repl_pwd ping_interval = 1 ping_type = SELECT 2、appl.conf 文件 这是针对每一套 MySQL Replication 应用专门的配置文件,若管理多套 MySQL Replication,可 配置多个文件,其中包括[server_default]和[server_xxx]两个项目,分别用于配置 App Scope、 Local Scope 类型的参数。 添加管理节点的配置文件,命名 app1.cnf,添加如下内容: [root@devdbserver mha]# pwd /etc/mha [root@devdbserver mha]# vi app1.cnf [server default] user=root password=root manager_workdir=/usr/local/mha/app1 manager_log=/usr/local/mha/app1/manager.log remote_workdir=/usr/local/mha/app1 ssh_user=root repl_user=slave repl_password=slave ping_interval=1 [server1] hostname=192.168.0.24 #ssh_port=9999 美河学习在线 www.eimhe.com master_binlog_dir=/usr/local/mysql/data/binlog candidate_master=1 [server2] hostname=192.168.0.39 #ssh_port=9999 master_binlog_dir=/usr/local/mysql/data/binlog candidate_master=1 参数详解: [server default] user=root //linux 用于管理 mysql 用戶名 password=root //linux 用于管理 mysql 密码 manager_workdir=/usr/local/mha/app1 //刚创建的目录 manager_log=/usr/local/mha/app1/manager.log //刚创建的目录下面日志 remote_workdir=/usr/local/mha/app1 //数据库节点的目录,如果不存在,会自动创建 ssh_user=root //ssh 免密钥登录的帐号名 repl_user=slave //mysql 主从复制帐号,用来在主从机之间同步二进制日志等 repl_password=slave //mysql 复制帐号的密码 ping_interval=1 //ping 间隔,用来检测 master 是否正常 [server1] hostname=192.168.0.24 //主机 ip #ssh_port=9999 master_binlog_dir=/usr/local/mysql/data/binlog //mysql 二进制日志目录 candidate_master=1 //master 机宕掉后,优先启用这台作为新 master [server2] hostname=192.168.0.39 //主机 ip #ssh_port=9999 master_binlog_dir=/usr/local/mysql/data/binlog candidate_master=1 //master 机宕掉后,优先启用这台作为新 master 6、映射 mysql 命令到/usr/bin 1、mysqlbinlog [root@rbdb-cs ~]# which mysqlbinlog /usr/local/mysql/bin/ mysqlbinlog [root@rbdb-cs ~]# ln -s /usr/local/mysql/bin/ mysqlbinlog /usr/bin/ mysqlbinlog 2、mysql [root@rbdb-cs ~]# which mysql /usr/local/mysql/bin/mysql [root@rbdb-cs ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql 美河学习在线 www.eimhe.com 7、测试 MHA 配置 1、masterha_check_ssh:验证 ssh 信任登录 [root@devdbserver mha]# masterha_check_ssh --conf=/etc/mha/app1.cnf Wed Jul 29 13:56:16 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed Jul 29 13:56:16 2015 - [info] Reading application default configuration from /etc/mha/app1.cnf.. Wed Jul 29 13:56:16 2015 - [info] Reading server configuration from /etc/mha/app1.cnf.. Wed Jul 29 13:56:16 2015 - [info] Starting SSH connection tests.. Wed Jul 29 13:56:16 2015 - [debug] Wed Jul 29 13:56:16 2015 - [debug] Connecting via SSH from root@192.168.0.24(192.168.0.24:22) to root@192.168.0.39(192.168.0.39:22).. Wed Jul 29 13:56:16 2015 - [debug] ok. Wed Jul 29 13:56:17 2015 - [debug] Wed Jul 29 13:56:16 2015 - [debug] Connecting via SSH from root@192.168.0.39(192.168.0.39:22) to root@192.168.0.24(192.168.0.24:22).. Wed Jul 29 13:56:17 2015 - [debug] ok. Wed Jul 29 13:56:17 2015 - [info] All SSH connection tests passed successfully. 2、masterha_check_repl:验证主从复制 [root@devdbserver mha]# masterha_check_repl --conf=/etc/mha/app1.cnf Wed Jul 29 14:24:19 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed Jul 29 14:24:19 2015 - [info] Reading application default configuration from /etc/mha/app1.cnf.. Wed Jul 29 14:24:19 2015 - [info] Reading server configuration from /etc/mha/app1.cnf.. Wed Jul 29 14:24:19 2015 - [info] MHA::MasterMonitor version 0.56. Wed Jul 29 14:24:19 2015 - [info] GTID failover mode = 0 Wed Jul 29 14:24:19 2015 - [info] Dead Servers: Wed Jul 29 14:24:19 2015 - [info] Alive Servers: Wed Jul 29 14:24:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Wed Jul 29 14:24:19 2015 - [info] 192.168.0.39(192.168.0.39:3306) Wed Jul 29 14:24:19 2015 - [info] Alive Slaves: Wed Jul 29 14:24:19 2015 - [info] 192.168.0.39(192.168.0.39:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Wed Jul 29 14:24:19 2015 - [info] Replicating from 192.168.0.24(192.168.0.24:3306) 美河学习在线 www.eimhe.com Wed Jul 29 14:24:19 2015 - [info] Primary candidate for the new Master (candidate_master is set) Wed Jul 29 14:24:19 2015 - [info] Current Alive Master: 192.168.0.24(192.168.0.24:3306) Wed Jul 29 14:24:19 2015 - [info] Checking slave configurations.. Wed Jul 29 14:24:19 2015 - [info] Checking replication filtering settings.. Wed Jul 29 14:24:19 2015 - [info] binlog_do_db= , binlog_ignore_db= Wed Jul 29 14:24:19 2015 - [info] Replication filtering check ok. Wed Jul 29 14:24:19 2015 - [info] GTID (with auto-pos) is not supported Wed Jul 29 14:24:19 2015 - [info] Starting SSH connection tests.. Wed Jul 29 14:24:20 2015 - [info] All SSH connection tests passed successfully. Wed Jul 29 14:24:20 2015 - [info] Checking MHA Node version.. Wed Jul 29 14:24:20 2015 - [info] Version check ok. Wed Jul 29 14:24:20 2015 - [info] Checking SSH publickey authentication settings on the current master.. Wed Jul 29 14:24:20 2015 - [info] HealthCheck: SSH to 192.168.0.24 is reachable. Wed Jul 29 14:24:21 2015 - [info] Master MHA Node version is 0.56. Wed Jul 29 14:24:21 2015 - [info] Checking recovery script configurations on 192.168.0.24(192.168.0.24:3306).. Wed Jul 29 14:24:21 2015 - [info] Executing command: save_binary_logs --command=test -- start_pos=4 --binlog_dir=/usr/local/mysql/data/binlog -- output_file=/usr/local/mha/app1/save_binary_logs_test --manager_version=0.56 -- start_file=binlog.000003 Wed Jul 29 14:24:21 2015 - [info] Connecting to root@192.168.0.24(192.168.0.24:22).. Creating /usr/local/mha/app1 if not exists.. ok. Checking output directory is accessible or not.. ok. Binlog found at /usr/local/mysql/data/binlog, up to binlog.000003 Wed Jul 29 14:24:21 2015 - [info] Binlog setting check done. Wed Jul 29 14:24:21 2015 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers.. Wed Jul 29 14:24:21 2015 - [info] Executing command : apply_diff_relay_logs --command=test --slave_user='root' --slave_host=192.168.0.39 --slave_ip=192.168.0.39 --slave_port=3306 -- workdir=/usr/local/mha/app1 --target_version=5.6.20-log --manager_version=0.56 -- relay_log_info=/usr/local/mysql/data/relay-log.info --relay_dir=/usr/local/mysql/data/ -- slave_pass=xxx Wed Jul 29 14:24:21 2015 - [info] Connecting to root@192.168.0.39(192.168.0.39:22).. Checking slave recovery environment settings.. Opening /usr/local/mysql/data/relay-log.info ... ok. Relay log found at /usr/local/mysql/data, up to rbdb-cs-relay-bin.000002 Temporary relay log file is /usr/local/mysql/data/rbdb-cs-relay-bin.000002 Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure. done. Testing mysqlbinlog output.. done. 美河学习在线 www.eimhe.com Cleaning up test file(s).. done. Wed Jul 29 14:24:22 2015 - [info] Slaves settings check done. Wed Jul 29 14:24:22 2015 - [info] 192.168.0.24(192.168.0.24:3306) (current master) +--192.168.0.39(192.168.0.39:3306) Wed Jul 29 14:24:22 2015 - [info] Checking replication health on 192.168.0.39.. Wed Jul 29 14:24:22 2015 - [info] ok. Wed Jul 29 14:24:22 2015 - [warning] master_ip_failover_script is not defined. Wed Jul 29 14:24:22 2015 - [warning] shutdown_script is not defined. Wed Jul 29 14:24:22 2015 - [info] Got exit code 0 (Not master dead). MySQL Replication Health is OK. 3、验证主从复制问题 1、Can't exec "mysqlbinlog" Can't exec "mysqlbinlog":没有那个文件或目录 at /usr/share/perl5/vendor_perl/MHA/BinlogManager.pm line 106. mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options at /usr/bin/apply_diff_relay_logs line 493 1. 处理办法: 2. 在所有节点上执行 3. which mysqlbinlog; --/mysql/bin/mysqlbinlog 4. ln -s /mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog 2、Testing mysql connection and privileges..sh: mysql ThuJul3100:56:012014-[info] Connecting to root@192.168.1.21(192.168.1.21:22).. Creating directory /var/log/masterha/app1.. done. Checking slave recovery environment settings.. Opening/mysql/data/relay-log.info ... ok. Relay log found at /mysql/data, up to likun1-relay-bin.143287 Temporary relay log file is /mysql/data/likun1-relay-bin.143287 Testing mysql connection and privileges..sh: mysql: command not found mysql command failed with rc 127:0! at /usr/bin/apply_diff_relay_logs line 375 main::check() called at /usr/bin/apply_diff_relay_logs line 497 eval {...} called at /usr/bin/apply_diff_relay_logs line 475 main::main() called at /usr/bin/apply_diff_relay_logs line 120 美河学习在线 www.eimhe.com 解决办法:跟上面一样 ln -s `which mysql`/usr/bin/mysql 3、wo or more masters are either writable [root@mysql1 ~]# masterha_check_repl --conf=/etc/app1.cnf ThuJul3100:25:482014-[error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln781]Multi-master configuration is detected, but two or more masters are either writable (read- only is not set) or dead!Check configurations for details.Master configurations are as below: Master192.168.1.20(192.168.1.20:3306), replicating from 192.168.1.21(192.168.1.21:3306) Master192.168.1.21(192.168.1.21:3306), replicating from 192.168.1.20(192.168.1.20:3306) ThuJul3100:25:482014-[error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424]Error happened on checking configurations. at /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm line 326 ThuJul3100:25:482014-[error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln523]Error happened on monitoring servers. ThuJul3100:25:482014-[info]Got exit code 1(Not master dead). MySQLReplicationHealth is NOT OK! 处理办法:日志报说有多个主,经过检查,发现 20 和 21 为主主,关闭 20 的 slave。 8、启动 MHA [root@devdbserver mha]# nohup masterha_manager --conf=/etc/mha/app1.cnf > /tmp/mha_manager.log 2>&1 验证 MHA 是否开启并正常运行: [root@devdbserver app1]# masterha_check_status --conf=/etc/mha/app1.cnf app1 (pid:9228) is running(0:PING_OK), master:192.168.0.24 查看日志: [root@devdbserver app1]# pwd /usr/local/mha/app1 [root@devdbserver app1]# tail -50f manager.log Wed Jul 29 14:39:44 2015 - [info] Connecting to root@192.168.0.39(192.168.0.39:22).. Checking slave recovery environment settings.. Opening /usr/local/mysql/data/relay-log.info ... ok. Relay log found at /usr/local/mysql/data, up to rbdb-cs-relay-bin.000002 Temporary relay log file is /usr/local/mysql/data/rbdb-cs-relay-bin.000002 Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure. done. Testing mysqlbinlog output.. done. Cleaning up test file(s).. done. 美河学习在线 www.eimhe.com Wed Jul 29 14:39:45 2015 - [info] Slaves settings check done. Wed Jul 29 14:39:45 2015 - [info] 192.168.0.24(192.168.0.24:3306) (current master) +--192.168.0.39(192.168.0.39:3306) Wed Jul 29 14:39:45 2015 - [warning] master_ip_failover_script is not defined. Wed Jul 29 14:39:45 2015 - [warning] shutdown_script is not defined. Wed Jul 29 14:39:45 2015 - [info] Set master ping interval 1 seconds. Wed Jul 29 14:39:45 2015 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes. Wed Jul 29 14:39:45 2015 - [info] Starting ping health check on 192.168.0.24(192.168.0.24:3306).. Wed Jul 29 14:39:45 2015 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond.. 9、关闭 MHA 对于一个正在运行的 MHA,可通过 masterha_stop 命令关闭,如下: [root@devdbserver app1]# masterha_stop --conf=/etc/mha/app1.cnf Stopped app1 successfully. [root@devdbserver app1]# masterha_check_status --conf=/etc/mha/app1.cnf app1 is stopped(2:NOT_RUNNING). 3、测试主从同步 1、主库操作插入数据 mysql> use test; 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 mysql> create table test1(id int(2),name varchar(32)); Query OK, 0 rows affected (0.06 sec) mysql> mysql> insert into test1(id,name) values(1,'du'); Query OK, 1 row affected (0.00 sec) 2、从库操作查询 mysql> select * from test.test1; +------+------+ | id | name | +------+------+ | 1 | du | 美河学习在线 www.eimhe.com +------+------+ 1 row in set (0.00 sec) 4、MHA-failover 测试 http://os.51cto.com/art/201307/401702_all.htm 第一次切换后,需要删除/usr/local/mha/app1 路径下的 app1.failover.complete 文件,才能再 次执行切换。 1、MHA-failover 测试 在主库上执行 service mysql stop;观察 MHA 的日志情况如下,成功切换到从库 192.168.0.39。 在 192.168.0.39 上面可以正常执行插入等操作。 1、切换后 192.168.0.39 库的状态 mysql> show slave status\G; Empty set (0.00 sec) ERROR: No query specified mysql> show master status\G; *************************** 1. row *************************** File: binlog.000004 Position: 408 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.01 sec) ERROR: No query specified 2、切换后 192.168.0.39 插入操作 mysql> use test; 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 mysql> insert into test1(id,name) values(2,'du'); 美河学习在线 www.eimhe.com Query OK, 1 row affected (0.04 sec) mysql> select* from test1; +------+------+ | id | name | +------+------+ | 1 | du | | 2 | du | +------+------+ 2 rows in set (0.01 sec) 3、切换过程中的 MHA 日志: root@devdbserver app1]# tail -20f manager.log Thu Jul 30 10:56:08 2015 - [info] Connecting to root@192.168.0.39(192.168.0.39:22).. Checking slave recovery environment settings.. Opening /usr/local/mysql/data/relay-log.info ... ok. Relay log found at /usr/local/mysql/data, up to rbdb-cs-relay-bin.000005 Temporary relay log file is /usr/local/mysql/data/rbdb-cs-relay-bin.000005 Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure. done. Testing mysqlbinlog output.. done. Cleaning up test file(s).. done. Thu Jul 30 10:56:09 2015 - [info] Slaves settings check done. Thu Jul 30 10:56:09 2015 - [info] 192.168.0.24(192.168.0.24:3306) (current master) +--192.168.0.39(192.168.0.39:3306) Thu Jul 30 10:56:09 2015 - [warning] master_ip_failover_script is not defined. Thu Jul 30 10:56:09 2015 - [warning] shutdown_script is not defined. Thu Jul 30 10:56:09 2015 - [info] Set master ping interval 1 seconds. Thu Jul 30 10:56:09 2015 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes. Thu Jul 30 10:56:09 2015 - [info] Starting ping health check on 192.168.0.24(192.168.0.24:3306).. Thu Jul 30 10:56:09 2015 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond.. Thu Jul 30 11:02:41 2015 - [warning] Got error on MySQL select ping: 2006 (MySQL server has gone away) Thu Jul 30 11:02:41 2015 - [info] Executing SSH check script: save_binary_logs --command=test -- start_pos=4 --binlog_dir=/usr/local/mysql/data/binlog -- output_file=/usr/local/mha/app1/save_binary_logs_test --manager_version=0.56 -- binlog_prefix=binlog Thu Jul 30 11:02:41 2015 - [info] HealthCheck: SSH to 192.168.0.24 is reachable. Thu Jul 30 11:02:42 2015 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111) 美河学习在线 www.eimhe.com Thu Jul 30 11:02:42 2015 - [warning] Connection failed 2 time(s).. Thu Jul 30 11:02:43 2015 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111) Thu Jul 30 11:02:43 2015 - [warning] Connection failed 3 time(s).. Thu Jul 30 11:02:44 2015 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111) Thu Jul 30 11:02:44 2015 - [warning] Connection failed 4 time(s).. Thu Jul 30 11:02:44 2015 - [warning] Master is not reachable from health checker! Thu Jul 30 11:02:44 2015 - [warning] Master 192.168.0.24(192.168.0.24:3306) is not reachable! Thu Jul 30 11:02:44 2015 - [warning] SSH is reachable. Thu Jul 30 11:02:44 2015 - [info] Connecting to a master server failed. Reading configuration file /etc/masterha_default.cnf and /etc/mha/app1.cnf again, and trying to connect to all servers to check server status.. Thu Jul 30 11:02:44 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Thu Jul 30 11:02:44 2015 - [info] Reading application default configuration from /etc/mha/app1.cnf.. Thu Jul 30 11:02:44 2015 - [info] Reading server configuration from /etc/mha/app1.cnf.. Thu Jul 30 11:02:44 2015 - [info] GTID failover mode = 0 Thu Jul 30 11:02:44 2015 - [info] Dead Servers: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:44 2015 - [info] Alive Servers: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.39(192.168.0.39:3306) Thu Jul 30 11:02:44 2015 - [info] Alive Slaves: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.39(192.168.0.39:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 11:02:44 2015 - [info] Replicating from 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:44 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 11:02:44 2015 - [info] Checking slave configurations.. Thu Jul 30 11:02:44 2015 - [info] Checking replication filtering settings.. Thu Jul 30 11:02:44 2015 - [info] Replication filtering check ok. Thu Jul 30 11:02:44 2015 - [info] Master is down! Thu Jul 30 11:02:44 2015 - [info] Terminating monitoring script. Thu Jul 30 11:02:44 2015 - [info] Got exit code 20 (Master dead). Thu Jul 30 11:02:44 2015 - [info] MHA::MasterFailover version 0.56. Thu Jul 30 11:02:44 2015 - [info] Starting master failover. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] * Phase 1: Configuration Check Phase.. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] GTID failover mode = 0 Thu Jul 30 11:02:44 2015 - [info] Dead Servers: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:44 2015 - [info] Checking master reachability via MySQL(double check)... 美河学习在线 www.eimhe.com Thu Jul 30 11:02:44 2015 - [info] ok. Thu Jul 30 11:02:44 2015 - [info] Alive Servers: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.39(192.168.0.39:3306) Thu Jul 30 11:02:44 2015 - [info] Alive Slaves: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.39(192.168.0.39:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 11:02:44 2015 - [info] Replicating from 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:44 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 11:02:44 2015 - [info] Starting Non-GTID based failover. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] ** Phase 1: Configuration Check Phase completed. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] * Phase 2: Dead Master Shutdown Phase.. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] Forcing shutdown so that applications never connect to the current master.. Thu Jul 30 11:02:44 2015 - [warning] master_ip_failover_script is not set. Skipping invalidating dead master IP address. Thu Jul 30 11:02:44 2015 - [warning] shutdown_script is not set. Skipping explicit shutting down of the dead master. Thu Jul 30 11:02:44 2015 - [info] * Phase 2: Dead Master Shutdown Phase completed. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] * Phase 3: Master Recovery Phase.. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] * Phase 3.1: Getting Latest Slaves Phase.. Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] The latest binary log file/position on all slaves is binlog.000004:120 Thu Jul 30 11:02:44 2015 - [info] Latest slaves (Slaves that received relay log files to the latest): Thu Jul 30 11:02:44 2015 - [info] 192.168.0.39(192.168.0.39:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 11:02:44 2015 - [info] Replicating from 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:44 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 11:02:44 2015 - [info] The oldest binary log file/position on all slaves is binlog.000004:120 Thu Jul 30 11:02:44 2015 - [info] Oldest slaves: Thu Jul 30 11:02:44 2015 - [info] 192.168.0.39(192.168.0.39:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 11:02:44 2015 - [info] Replicating from 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:44 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] * Phase 3.2: Saving Dead Master's Binlog Phase.. 美河学习在线 www.eimhe.com Thu Jul 30 11:02:44 2015 - [info] Thu Jul 30 11:02:44 2015 - [info] Fetching dead master's binary logs.. Thu Jul 30 11:02:44 2015 - [info] Executing command on the dead master 192.168.0.24(192.168.0.24:3306): save_binary_logs --command=save --start_file=binlog.000004 --start_pos=120 --binlog_dir=/usr/local/mysql/data/binlog -- output_file=/usr/local/mha/app1/saved_master_binlog_from_192.168.0.24_3306_20150730110 244.binlog --handle_raw_binlog=1 --disable_log_bin=0 --manager_version=0.56 Creating /usr/local/mha/app1 if not exists.. ok. Concat binary/relay logs from binlog.000004 pos 120 to binlog.000004 EOF into /usr/local/mha/app1/saved_master_binlog_from_192.168.0.24_3306_20150730110244.binlog .. Binlog Checksum enabled Dumping binlog format description event, from position 0 to 120.. ok. No need to dump effective binlog data from /usr/local/mysql/data/binlog/binlog.000004 (pos starts 120, filesize 120). Skipping. Binlog Checksum enabled /usr/local/mha/app1/saved_master_binlog_from_192.168.0.24_3306_20150730110244.binlog has no effective data events. Event not exists. Thu Jul 30 11:02:45 2015 - [info] Additional events were not found from the orig master. No need to save. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 3.3: Determining New Master Phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] Finding the latest slave that has all relay logs for recovering other slaves.. Thu Jul 30 11:02:45 2015 - [info] All slaves received relay logs to the same position. No need to resync each other. Thu Jul 30 11:02:45 2015 - [info] Searching new master from slaves.. Thu Jul 30 11:02:45 2015 - [info] Candidate masters from the configuration file: Thu Jul 30 11:02:45 2015 - [info] 192.168.0.39(192.168.0.39:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 11:02:45 2015 - [info] Replicating from 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:02:45 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 11:02:45 2015 - [info] Non-candidate masters: Thu Jul 30 11:02:45 2015 - [info] Searching from candidate_master slaves which have received the latest relay log events.. Thu Jul 30 11:02:45 2015 - [info] New master is 192.168.0.39(192.168.0.39:3306) Thu Jul 30 11:02:45 2015 - [info] Starting master failover.. Thu Jul 30 11:02:45 2015 - [info] From: 192.168.0.24(192.168.0.24:3306) (current master) +--192.168.0.39(192.168.0.39:3306) 美河学习在线 www.eimhe.com To: 192.168.0.39(192.168.0.39:3306) (new master) Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 3.3: New Master Diff Log Generation Phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] This server has all relay logs. No need to generate diff files from the latest slave. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 3.4: Master Log Apply Phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] *NOTICE: If any error happens from this phase, manual recovery is needed. Thu Jul 30 11:02:45 2015 - [info] Starting recovery on 192.168.0.39(192.168.0.39:3306).. Thu Jul 30 11:02:45 2015 - [info] This server has all relay logs. Waiting all logs to be applied.. Thu Jul 30 11:02:45 2015 - [info] done. Thu Jul 30 11:02:45 2015 - [info] All relay logs were successfully applied. Thu Jul 30 11:02:45 2015 - [info] Getting new master's binlog name and position.. Thu Jul 30 11:02:45 2015 - [info] binlog.000004:408 Thu Jul 30 11:02:45 2015 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.0.39', MASTER_PORT=3306, MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=408, MASTER_USER='slave', MASTER_PASSWORD='xxx'; Thu Jul 30 11:02:45 2015 - [warning] master_ip_failover_script is not set. Skipping taking over new master IP address. Thu Jul 30 11:02:45 2015 - [info] Setting read_only=0 on 192.168.0.39(192.168.0.39:3306).. Thu Jul 30 11:02:45 2015 - [info] ok. Thu Jul 30 11:02:45 2015 - [info] ** Finished master recovery successfully. Thu Jul 30 11:02:45 2015 - [info] * Phase 3: Master Recovery Phase completed. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 4: Slaves Recovery Phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 4.1: Starting Parallel Slave Diff Log Generation Phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] Generating relay diff files from the latest slave succeeded. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 4.2: Starting Parallel Slave Log Apply Phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] All new slave servers recovered successfully. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] * Phase 5: New master cleanup phase.. Thu Jul 30 11:02:45 2015 - [info] Thu Jul 30 11:02:45 2015 - [info] Resetting slave info on the new master.. Thu Jul 30 11:02:45 2015 - [info] 192.168.0.39: Resetting slave info succeeded. Thu Jul 30 11:02:45 2015 - [info] Master failover to 192.168.0.39(192.168.0.39:3306) completed 美河学习在线 www.eimhe.com successfully. Thu Jul 30 11:02:45 2015 - [info] ----- Failover Report ----- app1: MySQL Master failover 192.168.0.24(192.168.0.24:3306) to 192.168.0.39(192.168.0.39:3306) succeeded Master 192.168.0.24(192.168.0.24:3306) is down! Check MHA Manager logs at devdbserver:/usr/local/mha/app1/manager.log for details. Started automated(non-interactive) failover. The latest slave 192.168.0.39(192.168.0.39:3306) has all relay logs for recovery. Selected 192.168.0.39(192.168.0.39:3306) as a new master. 192.168.0.39(192.168.0.39:3306): OK: Applying all logs succeeded. Generating relay diff files from the latest slave succeeded. 192.168.0.39(192.168.0.39:3306): Resetting slave info succeeded. Master failover to 192.168.0.39(192.168.0.39:3306) completed successfully. 2、测试后恢复 MHA 原主库 192.168.0.24 恢复为从库,192.168.0.39 作为主库。 1、登陆 39 主库查看日志位置 mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000004 | 605 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 2、24 从库执行 read_only=1 is not set on slave 192.168.0.24(192.168.0.24:3306). 需要修改 24 库的配置文件,read_only=1。 change master to master_host='192.168.0.39',master_user='slave',master_password='slave',MASTER_PORT=3306, master_log_file='binlog.000004',master_log_pos=605,MASTER_CONNECT_RETRY=10; mysql> change master to 美河学习在线 www.eimhe.com master_host='192.168.0.39',master_user='slave',master_password='slave',MASTER_PORT=3306, master_log_file='binlog.000004',master_log_pos=605,MASTER_CONNECT_RETRY=10; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.39 Master_User: slave Master_Port: 3306 Connect_Retry: 10 Master_Log_File: binlog.000004 Read_Master_Log_Pos: 605 Relay_Log_File: csdb24-relay-bin.000002 Relay_Log_Pos: 280 Relay_Master_Log_File: binlog.000004 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: 605 Relay_Log_Space: 454 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 美河学习在线 www.eimhe.com Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 39 Master_UUID: 4a736674-28f5-11e5-989b-0050568a53e2 Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it 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 1 row in set (0.00 sec) ERROR: No query specified 3、测试恢复后的同步 (1)39 主库插入 mysql> insert into test.test1(id,name) values(3,'zhang'); Query OK, 1 row affected (0.01 sec) mysql> select * from test.test1; +------+-------+ | id | name | +------+-------+ | 1 | du | | 2 | du | | 3 | zhang | +------+-------+ 3 rows in set (0.00 sec) (2)24 从库查询同步 mysql> select * from test.test1; +------+-------+ | id | name | 美河学习在线 www.eimhe.com +------+-------+ | 1 | du | | 2 | du | | 3 | zhang | +------+-------+ 3 rows in set (0.00 sec) 3、恢复后开启 MHA 1、执行检查 [root@devdbserver bin]# masterha_check_repl --conf=/etc/mha/app1.cnf …… hu Jul 30 11:48:13 2015 - [info] Dead Servers: Thu Jul 30 11:48:13 2015 - [info] Alive Servers: Thu Jul 30 11:48:13 2015 - [info] 192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:48:13 2015 - [info] 192.168.0.39(192.168.0.39:3306) Thu Jul 30 11:48:13 2015 - [info] Alive Slaves: Thu Jul 30 11:48:13 2015 - [info] 192.168.0.24(192.168.0.24:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 11:48:13 2015 - [info] Replicating from 192.168.0.39(192.168.0.39:3306) Thu Jul 30 11:48:13 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 11:48:13 2015 - [info] Current Alive Master: 192.168.0.39(192.168.0.39:3306) Thu Jul 30 11:48:13 2015 - [info] Checking slave configurations.. Thu Jul 30 11:48:13 2015 - [info] read_only=1 is not set on slave 192.168.0.24(192.168.0.24:3306). Thu Jul 30 11:48:13 2015 - [info] Checking replication filtering settings.. Thu Jul 30 11:48:13 2015 - [info] binlog_do_db= , binlog_ignore_db= Thu Jul 30 11:48:13 2015 - [info] Replication filtering check ok. Thu Jul 30 11:48:13 2015 - [info] GTID (with auto-pos) is not supported Thu Jul 30 11:48:13 2015 - [info] Starting SSH connection tests.. Thu Jul 30 11:48:14 2015 - [info] All SSH connection tests passed successfully. Thu Jul 30 11:48:14 2015 - [info] Checking MHA Node version.. Thu Jul 30 11:48:14 2015 - [info] Version check ok. …… Thu Jul 30 11:48:16 2015 - [info] Slaves settings check done. Thu Jul 30 11:48:16 2015 - [info] 192.168.0.39(192.168.0.39:3306) (current master) +--192.168.0.24(192.168.0.24:3306) Thu Jul 30 11:48:16 2015 - [info] Checking replication health on 192.168.0.24.. Thu Jul 30 11:48:16 2015 - [info] ok. 美河学习在线 www.eimhe.com Thu Jul 30 11:48:16 2015 - [warning] master_ip_failover_script is not defined. Thu Jul 30 11:48:16 2015 - [warning] shutdown_script is not defined. Thu Jul 30 11:48:16 2015 - [info] Got exit code 0 (Not master dead). MySQL Replication Health is OK. 2、开启 MHA [root@devdbserver app1]# masterha_manager --conf=/etc/mha/app1.cnf > /tmp/mha_manager.log 2>&1 [root@devdbserver bin]# masterha_check_status --conf=/etc/mha/app1.cnf app1 (pid:2867) is running(0:PING_OK), master:192.168.0.39 5、MHA 不间断切换 vip/keepalived http://os.51cto.com/art/201307/401702_all.htm 现在 192.168.0.39 是主库,192.168.0.24 是从库。 1、master_ip_failover_script-vip 脚本实现 http://www.linuxidc.com/Linux/2015-04/116493.htm http://my.oschina.net/u/142602/blog/272214 1、在主库设置 vip [root@rbdb-cs mysql]# ifconfig eth0:0 192.168.0.36 netmask 255.255.248.0 up [root@rbdb-cs mysql]# ping 192.168.0.36 PING 192.168.0.36 (192.168.0.36) 56(84) bytes of data. 64 bytes from 192.168.0.36: icmp_seq=1 ttl=64 time=0.049 ms ^C --- 192.168.0.36 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 843ms rtt min/avg/max/mdev = 0.049/0.049/0.049/0.000 ms [root@rbdb-cs network-scripts]# ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:8A:53:E2 inet addr:192.168.0.39 Bcast:192.168.7.255 Mask:255.255.248.0 inet6 addr: fe80::250:56ff:fe8a:53e2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:169059 errors:0 dropped:1201 overruns:0 frame:0 美河学习在线 www.eimhe.com TX packets:11337 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:12695462 (12.1 MiB) TX bytes:1511629 (1.4 MiB) eth0:0 Link encap:Ethernet HWaddr 00:50:56:8A:53:E2 inet addr:192.168.0.36 Bcast:192.168.7.255 Mask:255.255.248.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:11797 errors:0 dropped:0 overruns:0 frame:0 TX packets:11797 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:665155 (649.5 KiB) TX bytes:665155 (649.5 KiB) 2、配置 master_ip_failover 脚本 #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port ); my $vip = '192.168.0.36/21'; my $key = '0'; my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; GetOptions( 'command=s' => \$command, 'ssh_user=s' => \$ssh_user, 'orig_master_host=s' => \$orig_master_host, 美河学习在线 www.eimhe.com 'orig_master_ip=s' => \$orig_master_ip, 'orig_master_port=i' => \$orig_master_port, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, ); exit &main(); sub main { print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if ( $command eq "stop" || $command eq "stopssh" ) { my $exit_code = 1; eval { print "Disabling the VIP on old master: $orig_master_host \n"; &stop_vip(); $exit_code = 0; }; if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) { my $exit_code = 10; eval { print "Enabling the VIP - $vip on the new master - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Checking the Status of the script.. OK \n"; exit 0; 美河学习在线 www.eimhe.com } else { &usage(); exit 1; } } sub start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`; } sub stop_vip() { return 0 unless ($ssh_user); `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`; } sub usage { print "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host - -orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip -- new_master_port=port\n"; } 3、修改 MHA 的配置文件 修改/etc/mha/app1.cnf 配置文件,增加如下内容: master_ip_failover_script=/etc/mha/master_ip_failover 4、进行 MHA 切换 1、在 192.168.0.39 上执行 service mysql stop;,停止主库; [root@rbdb-cs ~]# service mysql stop; 2、观察 MHA 日志: [root@devdbserver app1]# tail -10f manager.log Thu Jul 30 14:30:39 2015 - [info] OK. Thu Jul 30 14:30:39 2015 - [warning] shutdown_script is not defined. Thu Jul 30 14:30:39 2015 - [info] Set master ping interval 1 seconds. Thu Jul 30 14:30:39 2015 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes. Thu Jul 30 14:30:39 2015 - [info] Starting ping health check on 192.168.0.39(192.168.0.39:3306).. Thu Jul 30 14:30:39 2015 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond.. 美河学习在线 www.eimhe.com Thu Jul 30 14:32:41 2015 - [warning] Got timeout on MySQL Ping(SELECT) child process and killed it! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 431. Thu Jul 30 14:32:41 2015 - [info] Executing SSH check script: save_binary_logs --command=test -- start_pos=4 --binlog_dir=/usr/local/mysql/data/binlog -- output_file=/usr/local/mha/app1/save_binary_logs_test --manager_version=0.56 -- binlog_prefix=binlog Thu Jul 30 14:32:42 2015 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond.. Thu Jul 30 14:32:43 2015 - [info] HealthCheck: SSH to 192.168.0.39 is reachable. Thu Jul 30 14:46:16 2015 - [warning] Got error on MySQL select ping: 2006 (MySQL server has gone away) Thu Jul 30 14:46:16 2015 - [info] Executing SSH check script: save_binary_logs --command=test -- start_pos=4 --binlog_dir=/usr/local/mysql/data/binlog -- output_file=/usr/local/mha/app1/save_binary_logs_test --manager_version=0.56 -- binlog_prefix=binlog Thu Jul 30 14:46:16 2015 - [info] HealthCheck: SSH to 192.168.0.39 is reachable. Thu Jul 30 14:46:17 2015 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111) Thu Jul 30 14:46:17 2015 - [warning] Connection failed 2 time(s).. Thu Jul 30 14:46:18 2015 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111) Thu Jul 30 14:46:18 2015 - [warning] Connection failed 3 time(s).. Thu Jul 30 14:46:19 2015 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111) Thu Jul 30 14:46:19 2015 - [warning] Connection failed 4 time(s).. Thu Jul 30 14:46:19 2015 - [warning] Master is not reachable from health checker! Thu Jul 30 14:46:19 2015 - [warning] Master 192.168.0.39(192.168.0.39:3306) is not reachable! Thu Jul 30 14:46:19 2015 - [warning] SSH is reachable. Thu Jul 30 14:46:19 2015 - [info] Connecting to a master server failed. Reading configuration file /etc/masterha_default.cnf and /etc/mha/app1.cnf again, and trying to connect to all servers to check server status.. Thu Jul 30 14:46:19 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Thu Jul 30 14:46:19 2015 - [info] Reading application default configuration from /etc/mha/app1.cnf.. Thu Jul 30 14:46:19 2015 - [info] Reading server configuration from /etc/mha/app1.cnf.. Thu Jul 30 14:46:19 2015 - [info] GTID failover mode = 0 Thu Jul 30 14:46:19 2015 - [info] Dead Servers: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.39(192.168.0.39:3306) Thu Jul 30 14:46:19 2015 - [info] Alive Servers: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Thu Jul 30 14:46:19 2015 - [info] Alive Slaves: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 14:46:19 2015 - [info] Replicating from 192.168.0.39(192.168.0.39:3306) 美河学习在线 www.eimhe.com Thu Jul 30 14:46:19 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 14:46:19 2015 - [info] Checking slave configurations.. Thu Jul 30 14:46:19 2015 - [info] read_only=1 is not set on slave 192.168.0.24(192.168.0.24:3306). Thu Jul 30 14:46:19 2015 - [info] Checking replication filtering settings.. Thu Jul 30 14:46:19 2015 - [info] Replication filtering check ok. Thu Jul 30 14:46:19 2015 - [info] Master is down! Thu Jul 30 14:46:19 2015 - [info] Terminating monitoring script. Thu Jul 30 14:46:19 2015 - [info] Got exit code 20 (Master dead). Thu Jul 30 14:46:19 2015 - [info] MHA::MasterFailover version 0.56. Thu Jul 30 14:46:19 2015 - [info] Starting master failover. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 1: Configuration Check Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] GTID failover mode = 0 Thu Jul 30 14:46:19 2015 - [info] Dead Servers: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.39(192.168.0.39:3306) Thu Jul 30 14:46:19 2015 - [info] Checking master reachability via MySQL(double check)... Thu Jul 30 14:46:19 2015 - [info] ok. Thu Jul 30 14:46:19 2015 - [info] Alive Servers: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Thu Jul 30 14:46:19 2015 - [info] Alive Slaves: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 14:46:19 2015 - [info] Replicating from 192.168.0.39(192.168.0.39:3306) Thu Jul 30 14:46:19 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 14:46:19 2015 - [info] Starting Non-GTID based failover. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] ** Phase 1: Configuration Check Phase completed. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 2: Dead Master Shutdown Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] Forcing shutdown so that applications never connect to the current master.. Thu Jul 30 14:46:19 2015 - [info] Executing master IP deactivation script: Thu Jul 30 14:46:19 2015 - [info] /etc/mha/master_ip_failover -- orig_master_host=192.168.0.39 --orig_master_ip=192.168.0.39 --orig_master_port=3306 -- command=stopssh --ssh_user=root IN SCRIPT TEST====/sbin/ifconfig eth0:0 down==/sbin/ifconfig eth0:0 192.168.0.36/21=== 美河学习在线 www.eimhe.com Disabling the VIP on old master: 192.168.0.39 Thu Jul 30 14:46:19 2015 - [info] done. Thu Jul 30 14:46:19 2015 - [warning] shutdown_script is not set. Skipping explicit shutting down of the dead master. Thu Jul 30 14:46:19 2015 - [info] * Phase 2: Dead Master Shutdown Phase completed. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 3: Master Recovery Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 3.1: Getting Latest Slaves Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] The latest binary log file/position on all slaves is binlog.000005:120 Thu Jul 30 14:46:19 2015 - [info] Latest slaves (Slaves that received relay log files to the latest): Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 14:46:19 2015 - [info] Replicating from 192.168.0.39(192.168.0.39:3306) Thu Jul 30 14:46:19 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 14:46:19 2015 - [info] The oldest binary log file/position on all slaves is binlog.000005:120 Thu Jul 30 14:46:19 2015 - [info] Oldest slaves: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 14:46:19 2015 - [info] Replicating from 192.168.0.39(192.168.0.39:3306) Thu Jul 30 14:46:19 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 3.2: Saving Dead Master's Binlog Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] Fetching dead master's binary logs.. Thu Jul 30 14:46:19 2015 - [info] Executing command on the dead master 192.168.0.39(192.168.0.39:3306): save_binary_logs --command=save --start_file=binlog.000005 --start_pos=120 --binlog_dir=/usr/local/mysql/data/binlog -- output_file=/usr/local/mha/app1/saved_master_binlog_from_192.168.0.39_3306_20150730144 619.binlog --handle_raw_binlog=1 --disable_log_bin=0 --manager_version=0.56 Creating /usr/local/mha/app1 if not exists.. ok. Concat binary/relay logs from binlog.000005 pos 120 to binlog.000005 EOF into /usr/local/mha/app1/saved_master_binlog_from_192.168.0.39_3306_20150730144619.binlog .. Binlog Checksum enabled Dumping binlog format description event, from position 0 to 120.. ok. No need to dump effective binlog data from /usr/local/mysql/data/binlog/binlog.000005 (pos starts 120, filesize 120). Skipping. Binlog Checksum enabled /usr/local/mha/app1/saved_master_binlog_from_192.168.0.39_3306_20150730144619.binlog has no effective data events. 美河学习在线 www.eimhe.com Event not exists. Thu Jul 30 14:46:19 2015 - [info] Additional events were not found from the orig master. No need to save. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 3.3: Determining New Master Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] Finding the latest slave that has all relay logs for recovering other slaves.. Thu Jul 30 14:46:19 2015 - [info] All slaves received relay logs to the same position. No need to resync each other. Thu Jul 30 14:46:19 2015 - [info] Searching new master from slaves.. Thu Jul 30 14:46:19 2015 - [info] Candidate masters from the configuration file: Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24(192.168.0.24:3306) Version=5.6.20-log (oldest major version between slaves) log-bin:enabled Thu Jul 30 14:46:19 2015 - [info] Replicating from 192.168.0.39(192.168.0.39:3306) Thu Jul 30 14:46:19 2015 - [info] Primary candidate for the new Master (candidate_master is set) Thu Jul 30 14:46:19 2015 - [info] Non-candidate masters: Thu Jul 30 14:46:19 2015 - [info] Searching from candidate_master slaves which have received the latest relay log events.. Thu Jul 30 14:46:19 2015 - [info] New master is 192.168.0.24(192.168.0.24:3306) Thu Jul 30 14:46:19 2015 - [info] Starting master failover.. Thu Jul 30 14:46:19 2015 - [info] From: 192.168.0.39(192.168.0.39:3306) (current master) +--192.168.0.24(192.168.0.24:3306) To: 192.168.0.24(192.168.0.24:3306) (new master) Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 3.3: New Master Diff Log Generation Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] This server has all relay logs. No need to generate diff files from the latest slave. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 3.4: Master Log Apply Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] *NOTICE: If any error happens from this phase, manual recovery is needed. Thu Jul 30 14:46:19 2015 - [info] Starting recovery on 192.168.0.24(192.168.0.24:3306).. Thu Jul 30 14:46:19 2015 - [info] This server has all relay logs. Waiting all logs to be applied.. Thu Jul 30 14:46:19 2015 - [info] done. Thu Jul 30 14:46:19 2015 - [info] All relay logs were successfully applied. Thu Jul 30 14:46:19 2015 - [info] Getting new master's binlog name and position.. 美河学习在线 www.eimhe.com Thu Jul 30 14:46:19 2015 - [info] binlog.000005:317 Thu Jul 30 14:46:19 2015 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.0.24', MASTER_PORT=3306, MASTER_LOG_FILE='binlog.000005', MASTER_LOG_POS=317, MASTER_USER='slave', MASTER_PASSWORD='xxx'; Thu Jul 30 14:46:19 2015 - [info] Executing master IP activate script: Thu Jul 30 14:46:19 2015 - [info] /etc/mha/master_ip_failover --command=start -- ssh_user=root --orig_master_host=192.168.0.39 --orig_master_ip=192.168.0.39 -- orig_master_port=3306 --new_master_host=192.168.0.24 --new_master_ip=192.168.0.24 -- new_master_port=3306 --new_master_user='root' --new_master_password='root' Unknown option: new_master_user Unknown option: new_master_password IN SCRIPT TEST====/sbin/ifconfig eth0:0 down==/sbin/ifconfig eth0:0 192.168.0.36/21=== Enabling the VIP - 192.168.0.36/21 on the new master - 192.168.0.24 Thu Jul 30 14:46:19 2015 - [info] OK. Thu Jul 30 14:46:19 2015 - [info] ** Finished master recovery successfully. Thu Jul 30 14:46:19 2015 - [info] * Phase 3: Master Recovery Phase completed. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 4: Slaves Recovery Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 4.1: Starting Parallel Slave Diff Log Generation Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] Generating relay diff files from the latest slave succeeded. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 4.2: Starting Parallel Slave Log Apply Phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] All new slave servers recovered successfully. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] * Phase 5: New master cleanup phase.. Thu Jul 30 14:46:19 2015 - [info] Thu Jul 30 14:46:19 2015 - [info] Resetting slave info on the new master.. Thu Jul 30 14:46:19 2015 - [info] 192.168.0.24: Resetting slave info succeeded. Thu Jul 30 14:46:19 2015 - [info] Master failover to 192.168.0.24(192.168.0.24:3306) completed successfully. Thu Jul 30 14:46:19 2015 - [info] ----- Failover Report ----- app1: MySQL Master failover 192.168.0.39(192.168.0.39:3306) to 192.168.0.24(192.168.0.24:3306) succeeded 美河学习在线 www.eimhe.com Master 192.168.0.39(192.168.0.39:3306) is down! Check MHA Manager logs at devdbserver:/usr/local/mha/app1/manager.log for details. Started automated(non-interactive) failover. Invalidated master IP address on 192.168.0.39(192.168.0.39:3306) The latest slave 192.168.0.24(192.168.0.24:3306) has all relay logs for recovery. Selected 192.168.0.24(192.168.0.24:3306) as a new master. 192.168.0.24(192.168.0.24:3306): OK: Applying all logs succeeded. 192.168.0.24(192.168.0.24:3306): OK: Activated master IP address. Generating relay diff files from the latest slave succeeded. 192.168.0.24(192.168.0.24:3306): Resetting slave info succeeded. Master failover to 192.168.0.24(192.168.0.24:3306) completed successfully. 5、检查 vip 漂移 在现在的主库 192.169.0.24 上观察 vip [root@csdb24 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:8A:D2:76 inet addr:192.168.0.24 Bcast:192.168.7.255 Mask:255.255.248.0 inet6 addr: fe80::250:56ff:fe8a:d276/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:163152 errors:0 dropped:1299 overruns:0 frame:0 TX packets:3064 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:12274237 (11.7 MiB) TX bytes:472931 (461.8 KiB) eth0:0 Link encap:Ethernet HWaddr 00:50:56:8A:D2:76 inet addr:192.168.0.36 Bcast:192.168.7.255 Mask:255.255.248.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 2、通过 vip192.168.0.36 登陆主库 [root@rbdb-cs mysql]# mysql -h 192.168.0.36 -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 28 Server version: 5.6.20-log Source distribution Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective 美河学习在线 www.eimhe.com owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 6、恢复从库 39 1、确定日志位置 (1)可以从 MHA 的切换日志查看日志位置: Thu Jul 30 14:46:19 2015 - [info] binlog.000005:317 Thu Jul 30 14:46:19 2015 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.0.24', MASTER_PORT=3306, MASTER_LOG_FILE='binlog.000005', MASTER_LOG_POS=317, MASTER_USER='slave', MASTER_PASSWORD='xxx'; (2)登陆 24 主库,命令查看 mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000005 | 317 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 2、39 库上创建 slave 服务 mysql> change master to master_host='192.168.0.24',master_user='slave',master_password='slave',MASTER_PORT=3306, master_log_file='binlog.000005',master_log_pos=317,MASTER_CONNECT_RETRY=10; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.24 Master_User: slave Master_Port: 3306 Connect_Retry: 10 Master_Log_File: binlog.000005 Read_Master_Log_Pos: 317 美河学习在线 www.eimhe.com Relay_Log_File: rbdb-cs-relay-bin.000002 Relay_Log_Pos: 280 Relay_Master_Log_File: binlog.000005 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: 317 Relay_Log_Space: 455 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: 24 Master_UUID: b9b6c0b8-d6a9-11e4-bff8-0050568ad276 Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: 美河学习在线 www.eimhe.com Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec) ERROR: No query specified 7、开启 MHA [root@devdbserver bin]# masterha_check_repl --conf=/etc/mha/app1.cnf [root@devdbserver app1]# masterha_manager --conf=/etc/mha/app1.cnf > /tmp/mha_manager.log 2>&1 [root@devdbserver bin]# masterha_check_status --conf=/etc/mha/app1.cnf app1 (pid:14022) is running(0:PING_OK), master:192.168.0.24 6、MHA 参数详解 http://www.2cto.com/database/201407/321559.html http://isadba.com/upload/mha_Parameters.htm http://wubx.net/mha-parameters/ 1、Local Scope: 针对每个 server 级别有效的选项.local scope 级别的参数需要在配置文件的 [server_xxx]段落配置。 2 、App Scope: 这个参数可以理解为针对一组 master-slave 集群. 这 些 参 数 需 要 在 [server_default]段落配置。 3、Global Scope: 这个参数针对所有的 MHA 管理的实例. global scope 级别的配置只有你在使 用一个 manager server 管理多组 master-slave 时使用。 Parameter Name Requ ired? Parame ter Scope Default Value Example hostname Yes Local Only - hostname=mysql_server1, hostname=192.168.0.1, etc ip No Local Only gethostbynam e($hostname) ip=192.168.1.3 美河学习在线 www.eimhe.com port No Local/Ap p/Global 3306 port=3306 ssh_host No Local Only same as hostname ssh_host=mysql_server1, ssh_host=192.168.0.1, etc ssh_ip No Local Only gethostbynam e($ssh_host) ssh_ip=192.168.1.3 ssh_port No Local/Ap p/Global 22 ssh_port=22 ssh_connection _timeout No Local/Ap p/Global 5 ssh_connection_timeout=20 ssh_options No Local/Ap p/Global ""(empty string) ssh_options="-i /root/.ssh/id_dsa2" candidate_mast er No Local Only 0 candidate_master=1 no_master No Local Only 0 no_master=1 ignore_fail No Local Only 0 ignore_fail=1 skip_init_ssh_ch eck No Local Only 0 skip_init_ssh_check=1 skip_reset_slav e No Local/Ap p/Global 0 skip_reset_slave=1 user No Local/Ap p/Global root user=mysql_root password No Local/Ap p/Global ""(empty string) password=rootpass repl_user No Local/Ap p/Global Master_User value from SHOW SLAVE STATUS repl_user=repl repl_password No Local/Ap p/Global - (current replication password) repl_user=replpass 美河学习在线 www.eimhe.com disable_log_bin No Local/Ap p/Global 0 disable_log_bin=1 master_pid_file No Local/Ap p/Global ""(empty string) master_pid_file=/var/lib/mysql/mast er1.pid ssh_user No Local/Ap p/Global current OS user ssh_user=root remote_workdir No Local/Ap p/Global /var/tmp remote_workdir=/var/log/masterha/ app1 master_binlog_d ir No Local/Ap p/Global /var/lib/mysql master_binlog_dir=/data/mysql1,/d ata/mysql2 log_level No App/Glo bal info log_level=debug manager_workdi r No App /var/tmp manager_workdir=/var/log/masterh a client_bindir No App - client_bindir=/usr/mysql/bin client_libdir No App - client_libdir=/usr/lib/mysql manager_log No App STDERR manager_log=/var/log/masterha/ap p1.log check_repl_dela y No App/Glo bal 1 check_repl_delay=0 check_repl_filter No App/Glo bal 1 check_repl_filter=0 latest_priority No App/Glo bal 1 latest_priority=0 multi_tier_slave No App/Glo bal 0 multi_tier_slave=1 ping_interval No App/Glo bal 3 ping_interval=5 ping_type No App/Glo bal SELECT ping_type=CONNECT secondary_chec k_script No App/Glo bal null secondary_check_script= masterha_secondary_check -s remote_dc1 -s remote_dc2 美河学习在线 www.eimhe.com master_ip_failov er_script No App/Glo bal null master_ip_failover_script=/usr/local /custom_script/master_ip_failover master_ip_onlin e_change_script No App/Glo bal null master_ip_online_change_script= /usr/local/custom_script/master_ip_ online_change shutdown_script No App/Glo bal null shutdown_script= /usr/local/custom_script/master_sh utdown report_script No App/Glo bal null report_script= /usr/local/custom_script/report init_conf_load_s cript No App/Glo bal null report_script= /usr/local/custom_script/init_conf_l oader 1、hostname/ip/port hostname 为 MySQL Server 的 IP 地址或主机名; ip 为 MySQL Server 的 IP 地址,缺省从$hostname 中获取; port 为 MySQL Server 的端口号,缺省为 3306 2、ssh_host/ssh_ip/ssh_port 4、candidate_master 你可能对于同一组 slave 中有着不同的规划,有的其望在 Master 故障时,提升为新的 Master(如: Raid1 的 slave 比 Raid0 的 slave 更适合做 Master) 这个参数的作用是当设计 candidate_master = 1 时,这个服务器有较高的优先级提升为新 的 master(还要具备: 开启 binlog, 复制没有延迟)。 所以当设置了 candidate_master = 1 的机器在 master 故障时必然成为新的 master. 但这是很有用的设置优先级的一个参 数。 如果设置了多台机器的 caddidate_master = 1 , 优先策略依赖于块名字([server_xxx]). [server_1] 优衔权高于[server_2]. 美河学习在线 www.eimhe.com 参数名 是否必须 作用域 默认值 例子及说明 candidate_master No Local Only 0 candidate_mast=1 5、no_master 是否禁止某个 Slave 成为 Master,缺省值为 0,表示每个 Slave 都有机会成为新的 Master; 若设置为 1,则对应的那个 Slave 永远不会成为 Master。 6、ignore_fail 在默认情况下,值为 0,MHA manager 不会在 slave 存在故障的情况下(已经不能通过 SSH/MySQL 进行连接,或是 SQL Thread 已经停止出错,其它原因)的情况下进行 Master 的故障切换(当不存在 slave 时 MHA manager 也会退出)。 但有些情况下你期望在 slave 存在问题的情况下,也进行故障切换。 所以当设置了 ignore_fail = 1 时,MHA 会在所有 的机器有问题的时间也会进行故障切换。 默认是 0,当某个 slave 的 ssh 或者 mysql 当掉或者复制失败的时候,MHA manager 不启动 failover。 但是有些环境下,你想要在某个特定的 slave 失败的时候继续执行 failover,把么就设置这个 ignore_fail=1,即时这个 slave 失败的时候,failover 依然继续执行。 7、user/password user/password (Local/App/Global) MySQL 数据库管理账户及密码,因为要执行一些必要的管理命令,比如:Stop Slave、Change Master、Reset Slave,所以该账户应该为 root,这也是缺省值。 8、repl_user /repl_password MySQL 用于复制的用户,也是用于生成 CHANGE MASTER TO 每个 slave 使用的用户。 这个用户必须有 REPLICATION SLAVE 权限在新的 Master 上。默认情况下 repl_user 会 在将来成为 master 的机器上运行 show slave status 获取到。 MySQL 中 repl_user 用 户 的 密 码 。 默认是当前复制用的密码。 当 你 使 用 online_master_switch 时,当使用–orig_master_is_new_slave(原来的Master成为新Master 的一个 slave)时,如果没有 repl_password 开启同步就会失败了。因为当前 master 上用于 复制的用户名和密码都是空的(MHA 在原来的 Master 上执行 change master to 时没有带 复制的密码,虽然其它 slave 上设置了复制的密码) 美河学习在线 www.eimhe.com 9、disable_log_bin disable_log_bin (Local/App/Global) 若设置该参数,则在 Slave 应用差异日志时,自身不生成二进制日志;MHA 内部是通过在调 用 mysqlbinlog 工具命令时加参数—disable-log-bin 实现的,缺省值为 0。 10、master_pid_file master_pid_file (Local/App/Global) 设置 Master 实例的 pid 文件,该参数适用于一台服务器安 装多个 MySQL 实例的情况。 11、ssh_user ssh_user (Local/App/Global) MHA Manager 和 Node 访问 MySQL Server 所使用的 OS 用户,在多种情况下,都会用到该账 户,比如:远程执行命令、在 Slave 间拷贝差异的 Relay logs 等。 该用户至少要拥有读取 MySQL binary/relay log 文件和 relay_log.info 文件的权限,以及日志 目录的写权限(remote_workdir 参数指定的路径)。 该用户不需要交互即可连接到其它服务器上,所以建议使用 SSH 公共密钥认证,即配置 SSH 等效性;缺省情况下,ssh_user 为系统管理账户,即 root 账户。 MHA Mananger, MHA node 系统上的用户。 这个帐号需要在远程机器上有执行权限 (Manager->MySQL),在 slave 成员之间复制差异的 relay-log(MySQL->MySQL) 这个用户必须有读取 MySQL 的 binary/relay 日志和 relay_log.info 的权限,还需要对远程 MySQL 上 remote_workdir 目录的写权限。 这个用户还必须可以直接 ssh 到远程机顺上, 推荐使用 ssh pbulic key . 一般使用的 ssh_user 也是运行 manager 那个那个用户。 12、manager_workdir manager_workdir (App) MHA Manger 节点生的工作目录全路径,其中生成各种相关的状态文 件,若未设置,则缺省为/var/tmp。 manager_workdir=/var/log/masterha 13、manager_log 指定 mha manager 的绝对路径的文件名日志文件。 如果没设置 MHA Manager 将打印到 STDOUT/STDERR。 当手工执行故障切换(交互模式切换),MHA Manager 会忽略 美河学习在线 www.eimhe.com manager_log 设置直接将日志输出到 STDOUT/STDERR。 manager_log=/var/log/masterha/app1.log 14、remote_workdir remote_workdir (Local/App/Global) 每个 MHA Node 节点(运行 MySQL 实例的服务器)的工作目录全路径,其中会生成日志文 件,缺省为/var/tmp;若路径不存在,MHA Node 会自动创建,当然这需要拥有足够的权限。 注意:不管是 Manager 还是 Node,都会检查目录的可用磁盘空间。 每个 MHA node 上,MHA 工作使用的目录的绝对路径.如果目录不存在,MHA 会自动创建,如果权 限不够,那么 MHA node 会意外终止,注意 MHA manager 和 MHA node 都不会检查这个目录的磁 盘可用空间,你需要自己保证有足够的可用空间.默认的 remote_workdir 是'/var/tmp'. remote_workdir=/var/log/masterha/app1 15、master_binlog_dir master_binlog_dir (Local/App/Global) MySQL 主库的 binlog 日志文件的全路径,缺省为/var/lib/mysql,根据实际情况设置为真实的 路径。该参数适用于这么一种情况:Master 实例故障,但 OS 系统运行正常,此时 MHA 可 通过 SSH 登录,然后读取并拷贝必须的二进制日志事件(即差异的日志)。 可见该参数是必要而有用的,因为 Master 死掉后,MHA 无法自动获取 binlog 日志文件的路 径。另外,可用逗号隔开设置多个路径。 master_binlog_dir=/data/mysql1,/data/mysql2 16、log_level log_level (App/Global) MHA Manager 的日志等级,可设置为 debug/info/warning/error,缺省 为 info。 log_level=debug 17、check_repl_delay 在默认情况下,改值为 1,当一个 slave 同步延迟超过 100M relay log(需要应用超过 100M relay log), MHA 在做故障切换时不会选择这个 slave 做为新的 master,因为恢复需要经过很 长时间.当设置了 check_repl_delay = 0, MHA 将忽略被选择的 slave 上的同步延迟。 这个 选项在设置了 candidate_master = 1 特声明的期望这台机器成为 master 的情况下特别有 用。 check_repl_delay = 0 美河学习在线 www.eimhe.com 18、check_repl_filter check_repl_filter (App/Global) 缺省情况下,如果 Master、Slaves 拥有不同的 binlog/replication 过滤规则,MHA 会报错并且 不开启监控或故障切换,这是为了避免一些意想不到的恢复错误,比如:Table not exists 等。 如果你百分百确信这些不同的过滤设置不会导致恢复问题,则设置该参数为 0。 需要注意的是:当应用差异日志时,MHA 并不检查过滤规则,若设置该参数为 0,可能会遇 到“Table not exists”之类的错误,所以设置该参数时一定要小心,缺省设置为 1。 19、latest_priorty latest_priority (App/Global) 缺省情况下,MHA 选择最新的 Slave(即延迟最少的 Slave)优先成为新的 Master。如果你想 完全控制每个Slave成为Master的顺序,则可设置该参数为0,此时优先级由candidate_master 参数和每个 Slave 的[server_xxx]顺序决定。 20、multi_tier_slave multi_tier_slave (App/Global) 缺省情况下,默认值为 0,MHA 是不允许配置多层(3 层及以上)复制结构的,例如:host1 ->host2->host3,此时 MHA 会报错而停止。 从版本 0.52 开始,MHA 引入了新的参数――multi_tier_slave,以此来支持多层复制配置。 若设置了该参数,MHA 不会因为 3 层复制结构而终止,而是忽略第三层复制;此时,若 host1 (master)崩溃,则 host2 被选择成为新的 Master,host3 继续从 host2 复制,好像第三层复 制不存在一样。 multi_tier_slave=1 21、ping_interval ping_interval (App/Global) 该参数用于设置 MHA Manager 多长时间 ping(执行 ping SQL 语句)一次 Master,即 ping Master 实例的时间间隔,缺省为 3 秒。 当连续丢失 3 次连接间隔,即连续 ping 了 3 次都失败后,MHA Manager 则认为 Master 已经 死掉;所以通过这种 ping 机制发现故障的最长时间为 ping_interval 的 4 倍,即 12 秒。 注意:由于身份认证错误或 MySQL 实例连接数过多而导致的连接失败次数不计入 Master 死 亡统计数。 22、ping_type ping_type (App/Global) 美河学习在线 www.eimhe.com 缺省情况下,MHA 创建一个到 Master 的持久连接,然后定期(由 ping_interval 参数决定) 执行“SELECT 1”( ping_type=SELECT),以此来检查 Master 的可用性。 但在有些情况下,通过定期地“创建/断开连接”方式效果会更好,因为这种方式相对来说 更严格,并且可以更快地监测到 TCP 连接级故障;若采用这种方式,需设置 ping_type=CONNECT。 该参数是从版本 0.53 开始引入的,可设置为 CONNECT 或 SELECT,缺省为 SELECT。从 MHA 0.56 后 pint_type=INSERT 也被添加。 23、secondary_check_script secondary_check_script (App/Global) 默认情况下,MHA 通过单个路由(即从 Manager 到 Master)来检查 Master 的可用性,这显 然是不够完善的,强烈建议采用两个或多个网络路由来检查 Master 的可用性。 MHA 正是通过调用 secondary_check_script 参数定义的外部脚本来实现多路由监测的,比 如: secondary_check_script=masterha_secondary_check -s remote_host1 -s remote_host2 masterha_secondary_check 包含于 MHA Manager 包中,其内置的脚本在多数情况下还是比 较好用的;当然,若需要更多的功能,也可自定义一个网络检查脚本,然后通过该参数调 用。 在上面的例子中,MHA 通过如下两条路径来监测 MySQL Master Server 的活动: Manager(A)->remote_host1(B)->master_host Manager(A)->remote_host2(B)->master_host 通过这两条路径: (1)若连接 A 成功,连接 B 失败,masterha_secondary_check 退出并返回代码 0,MHA Manager 判断 Master 已经真正死掉,并开始故障切换; (2)如果 A 不成功,masterha_secondary_check 退出并返回代码 2,MHA Manager 猜猜可 能发生了网络问题,并不开始故障切换; (3)若 B 成功,则退出并返回代码 3,此时 MHA Manager 认为 Master 实际上是活着的, 也不开始故障切换。 一般来说,remote_host1 和 remote_host2 这两条从 MHA Manager 到 MySQL Server 的通道 应该位于为不同的网段。 MHA 调用该参数定义的脚本时,会自动传递 user/master_host/master_ip/master_port 这 几个参数,所以无需重复定义。 美河学习在线 www.eimhe.com 使用 masterha_secondary_check,有以下几点需要说明: ――内置脚本依赖于 IO::Socket::INET Perl 包,该包从 Perl v5.6.0 缺省已包含; ――内置脚本需要通过 SSH 连接到其它远程服务器,所以需要设置 SSH 公共密钥认证; ――另外,内置脚本尝试从 remote server 建立到 MySQL Master 的 TCP 连接,这意味着 MySQL 配置文件中的 max_connections 设置不受影响,如果 TCP 连接成功, 则 MySQL 的 aborted_connects 状态值递增 1。 secondary_check_script = masterha_secondary_check -s remote_host1 -s remote_host2 24、master_ip_failover_script 常用的 HA 环境,通常是通过 VIP 来实现的,在 Master 上绑定一个 VIP,Master 崩溃 后,由 HA 将 VIP 切换到 Standby 上。 另一种常见方法是创建一个全局目录数据库,里面存放所有的应用和 Writer/Reader IP 地址映射列表,以此来代替 VIP,这种情况下,若 Master 故障,则需更新映射列表。 这两种方法各有利弊,MHA 不限制使用哪一种,允许用户使用任何基于 IP 地址的故障切换 方案;该参数就是用于此目的,换句话说,就是需要自行编写一个脚本来保证应用可以透 明地 连接到新的 Master 上,并通过该参数调用,比如: master_ip_failover_script=/usr/local/sample/bin/master_ip_failover 示例脚本为(MHA Manager package)/samples/scripts/master_ip_failover。 整个运行期间,MHA Manager 需要调用该脚本 3 次,第一次是在开始监控之前,目的是检 查脚本的可用性,第二次是在调用 shutdown_script 脚本之前,第三次是在新的 Master 应 用完所有的 relay logs 之后。调用期间,MHA Manager 会传递如下参数: Checking phase --command=status --ssh_user=(current master's ssh username) --orig_master_host=(current master's hostname) --orig_master_ip=(current master's ip address) --orig_master_port=(current master's port number) Current master shutdown phase 美河学习在线 www.eimhe.com --command=stop or stopssh --ssh_user=(dead master's ssh username,if reachable via ssh) --orig_master_host=(current(dead) master's hostname) --orig_master_ip=(current(dead) master's ip address) --orig_master_port=(current(dead) master's port number) New master activation phase --command=start --ssh_user=(new master's ssh username) --orig_master_host=(dead master's hostname) --orig_master_ip=(dead master's ip address) --orig_master_port=(dead master's port number) --new_master_host=(new master's hostname) --new_master_ip=(new master's ip address) --new_master_port=(new master's port number) --new_master_user=(new master's user) --new_master_password=(new master's password) 如果采用的是在 Master 上绑定共享 VIP 方式,那么在 Master 关闭阶段,只需 shutdown_script 之后关闭主机电源即可,不需要做其它的事情;在新的 Master 启动阶 段,将这个 VIP 分配到新的 Master 上。 如果采用的是目录数据库方式,那么在 Master 关闭阶段,需要删除或修改 dead master 这 条记录;在新的 Master 启动阶段,需要插入或修改 new master 这条记录。 此外,可能还需要做一些其它的事情,比如:SET GLOBAL read_only=0,创建拥有写权限 的用户等,以便应用可以在新的 Master 上执行写操作。 MHA Manager 检查脚本返回的代码,并据此执行不同的操作,若脚本退出时返回代码 0 或 10,MHA Manager 继续操作;若脚本退出时返回 0 或 10 之外的代码, MHA Manager 将终止而不会继续故障切换。该参数默认值为空,所以 MHA Manager 缺省也 不会调用任何东西。 25、master_ip_online_change_script  这个参数有点类似于 master_ip_failover_script,但这个参数不用于 master 故障转意,只使用到 master 在线的切换。 美河学习在线 www.eimhe.com  冻结 Master 写的过程: –command=stop or stopssh –orig_master_host = (当前 master 的主机名) –orig_master_ip = (当前 master 的 ip 地址) –orig_master_port = (当前 master 的 port 端口号) –orig_master_user = (当前 master 的用户) –orig_master_password = (当前 master 的用户名) –orig_master_ssh_user = (从 0.56 支持,当前 master 的 ssh 的用户名) –orig_master_is_new_slave = (从 0.56 ,是否把原 Master 更改为新的 slave)  新的 Master 接受写的过程: –command=start –orig_master_host = ( 原 master 的机器名 ) –orig_master_ip = ( 原 master 的 ip ) –orig_master_port = ( 原 master 的端口号 ) –new_master_host = (新 master 的机器名) –new_master_ip = (新 master 的 ip) –new_master_port = (新 master 的端口号) –new_master_user = (新 master 上的用户名) –new_master_password = (新 master 上的用户名及密码) –new_master_ssh_user = (从 0.56 支持, 新 master 上的 ssh 用户) MHA 在冻结写的切换过程中会在 Master 上执行 FlUSH TABLES WITH READ LOCK, 在这个优雅的切换过程不会有任何写入的。在新的Master 在开始授权写的过 程中,你可以做和 master_ip_failover_script 一样的事情。 例如: 创建 用户及权限, 执行 set global read_only=0, 更新数据库路由表竺。 如果 脚本执行退出码不是 0 或是 10, MHA Manager 异常退出并发不会继续进行 master 切换。 默认这个参数是空的,所以 MHA Manager 在默认情况下什么也不做。 可以在(MHA Manager package)/samples/scripts/master_ip_online_change。 里找到例子脚本。例子脚本包含于 MHA Manager 源文件或是 GitHub 的分支中。 master_ip_online_change_script= /usr/local/custom_script/master_ip_online_change 26、shutdown_script 该参数默认值为空,所以 MHA Manager 缺省不会调用任何东西。 有些情况下,为了避免脑裂问题,可能需要强制关闭 Master 以隔离该节点,防止其重启服 务。 该参数就是为了实现这个目的的,它调用一个强制关闭 master 的脚本,比如: shutdown_script=/usr/local/sample/bin/power_manager 美河学习在线 www.eimhe.com (示例脚本位于 MHA Manager 源码包中) 在调用 shutdown_script 之前,MHA Manager 先执行一个内部检查,看 Master 所在的服务器 是否还可以通过 SSH 方式连接,若可以连接(比如:操作正常,而 mysqld 故障的情况), MHA Manager 将传递如下参数: --command=stopssh --ssh_user=(ssh username so that you can connect to the master) --host=(master's hostname) --ip=(master's ip address) --port=(master's port number) --pid_file=(master's pid file) 如果 Master 所在的服务器已经故障,无法通过 SSH 连接,则传递如下参数: --command=stop --host=(master's hostname) --ip=(master's ip address) 该示例脚本的工作原理大致如下: 如果成功传递了--command=stopssh,那么说明 Master 所在的服务器系统是正常运行的,此 时将通过 SSH 方式连接到该服务器,通过系统命令“kill -9”杀掉所有的 mysqld 和 mysqld_safe 进程; 如果--pid_file 也成功传递,那么脚本将试图杀掉指定的某个进程,而不是所有的 mysqld 进 程,这适用于一台服务器上安装多个 MySQL 实例的情况。若 mysqld 进程成功杀掉,则脚本 返回代码 10,MHA Manager 据此再次连接 Master,并保存必要的二进制日志。 如果不能通过 SSH 方式连接到 Master 服务器,或者传递的命令为--command=stop,那么脚 本将尝试关闭该服务器的电源。关闭电源命令依赖于 H/W,不同服务器也不尽相同,对于 HP(iLO)来说,使用 ipmitool 或 SSL 命令;对于 Dell(DRAC)来说,使用 dracadm 命令。若成功 关闭了服务器电源,则脚本返回代码 0,否则返回代码 1。 如果返回的代码为 0,MHA Manager 则开始故障切换过程,如果返回的是 0 或 10 之外的代 码,MHA Manager 将终止故障切换。 该参数缺省值为空,所以不会执行任何操作。 另外,在启动监控时,MHA Manager 会调用 shutdown_scrip 脚本,并传递如下参数: --command=status --host=(master's hostname) --ip=(master's ip address) 这里,我们可以检查脚本设置,电源控制依赖于 H/W,因此强烈建议检查电源状态,若有某 些错误,也可在启动监控之前注意到。 你可能需要强制关闭 master 服务器,避免他再次提供服务,这对于避免脑裂很重要.下面是一个实 例: shutdown_script= /usr/local/sample/bin/power_manager 你可以从(MHA Manager package)/samples/scripts/power_manager 找到一个简单的脚本.这个 脚本在 manager 的 tarball 和 GitHUb branch 中才包含. 在调用 shutdown_script 脚本之前,MHA manager 内部会通过 ssh 尝试连接到 mysql master,如 果 ssh 可以连接(意思就是 OS 是存活的,但是 Mysqld 没有运行),MHAmanager 就会传递下面的 参数: 美河学习在线 www.eimhe.com  --command=stopssh (这个意思就是指停止服务,不会关机)  --ssh_user=(ssh username so that you can connect to the master)  --host=(master's hostname)  --ip=(master's ip address)  --port=(master's port number)  --pid_file=(master's pid file) 如果 master 主机的 ssh 不能连接,那么 MHA 会使用如下参数:  --command=stop (这个会通过 fence 设备关掉电源)  --host=(master's hostname)  --ip=(master's ip address) 这个脚本的大概功能如下,如果--command=stopssh 被调用,脚本会使用 killall -9 杀掉目标服务 器上所有的 mysqld_safe 服务.如果--pid_file 被设置,脚本尝试 kill 指定的进程.如果脚本执行成 功,那么脚本会退出返回状态 10.如果退出状态为 10,MHA manager 后面会通过 ssh 连接到 master,获取需要的 binary log.如果脚本通过 ssh 连接到服务器失败,那么就会传递-- command=stop 参数,这个参数尝试关闭机器的电源,关闭电源依赖于 H/W.HP(ILO),DELL(DRAC).如果 power off 成功,脚本会然会状态 0,其他情况会返回状态 1.当返 回状态是 0 的时候 MHA manager 开始 failover.如果返回状态不是 0 或者 10,那么 MHA manager 会意外终止.这个参数默认是空,所以 MHA manager 不会调用任何脚本. 另外,MHA manager 在启动 monitoring 之前调用 shutdown_script.这时候会传递下面的参数.目 的是检测脚本是否可用,如果发现错误,你可以提前知道.  --command=status  --host=(master's hostname)  --ip=(master's ip address) 27、report_script 你希望当 failover 发生以后可以发送一个报告(例如 email),report_script 可以达到这个目 的,MHA manager 传递下面的参数.  --orig_master_host=(dead master's hostname)  --new_master_host=(new master's hostname)  --new_slave_hosts=(new slaves' hostnames, delimited by commas)  --subject=(mail subject)  --body=(body) 默认这个参数是空的,所以 MHA manager 不调用任何脚本. 美河学习在线 www.eimhe.com 你可以从(MHA Manager package)/samples/scripts/send_report 找到一个简单的脚本.这个脚本 在 manager 的 tarball 和 GitHUb branch 中才包含。 28、init_conf_load_script 这个脚本可以在你不想在配置文件中写明文密码的时候使用.你可以覆盖全局配置参数.实例脚 本如下. #!/usr/bin/perl print "password=$ROOT_PASS\n"; print "repl_password=$REPL_PASS\n"; 这个参数默认为空,所以 MHA manager 默认不调用任何脚本. 若想在配置文件中使用纯文本(比如 password 和 repl_password),可使用该参数,脚本返回 “name=value”对,可以覆盖全局配置文件中的参数,比如: #! /usr/bin/perl Print "password=$ROOT_PASS\n"; Print "repl_password=$REPL_PASS\n" 该参数默认为空。 11、mysql 的备份恢复 http://www.jb51.net/article/22727.htm http://www.jb51.net/article/38436.htm http://www.open-open.com/lib/view/open1382152331946.html http://www.open-open.com/doc/view/25b526a543ed486581d41d60cf06fa29 http://www.2cto.com/database/201310/248423.html http://www.cnblogs.com/zeroone/archive/2010/05/11/1732834.html http://blog.csdn.net/y243234469/article/details/6650831 2015-07-20 http://www.linuxidc.com/Linux/2013-09/89885.htm http://blog.sina.com.cn/s/blog_616b428f0101836h.html http://blog.itpub.net/27099995/viewspace-1295099/ 1、mysqldump/mysql/mysqlbinlog mysqldump 是采用 SQL 级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。 美河学习在线 www.eimhe.com 1、命令参数 mysqldump -u 用户名 -p 密码 -h 主机 数据库 表 案例: mysqldump -uroot -p sqlhk9 a --no-data 讲一下 mysqldump 的一些主要参数 --compatible=name 它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。 值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、 no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将 它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。 --complete-insert,-c 导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能 提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因 此,需要谨慎使用该参数,至少我不推荐。 --default-character-set=charset 指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出 时必须指定该选项,否则再次导入数据后将产生乱码问题。 --disable-keys 告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大 大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。 --extended-insert = true|false 默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本 选项,设定它的值为 false 即可。 --hex-blob 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字 段类型有 BINARY、VARBINARY、BLOB。 --lock-all-tables,-x 在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局 读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。 --lock-tables 它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的 表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。 --no-create-info,-t 只导出数据,而不添加 CREATE TABLE 语句。 --no-data,-d 不导出任何数据,只导出数据库表结构。 --opt 这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能 让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 美河学习在线 www.eimhe.com --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将 整个结果集放在内存中。如果导出大数据库的话可能会出现问题。 --quick,-q 该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取 得所有记录后将它们缓存到内存中。 --routines,-R 导出存储过程以及自定义函数。 --single-transaction 该选项在导出数据之前提交一个 BEGIN SQL 语句,BEGIN 不会阻塞任何应用程序且能保证 导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。 本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提 交。 要想导出大表的话,应结合使用 --quick 选项。 --triggers 同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。 其他参数详情请参考手册,我通常使用以下 SQL 来备份 MyISAM 表: /usr/local/mysql/bin/mysqldump -uyejr -pyejr " --default-character-set=utf8 --opt --extended-insert=false " --triggers -R --hex-blob -x db_name > db_name.sql 使用以下 SQL 来备份 Innodb 表: /usr/local/mysql/bin/mysqldump -uyejr -pyejr " --default-character-set=utf8 --opt --extended-insert=false " --triggers -R --hex-blob --single-transaction db_name > db_name.sql 另外,如果想要实现在线备份,还可以使用 --master-data 参数来实现,如下: /usr/local/mysql/bin/mysqldump -uyejr -pyejr " --default-character-set=utf8 --opt --master-data=1 " --single-transaction --flush-logs db_name > db_name.sql 它只是在一开始的瞬间请求锁表,然后就刷新 binlog 了,而后在导出的文件中加入 CHANGE MASTER 语句来指定当前备份的 binlog 位置,如果要把这个文件恢复到 slave 里去,就可以 采用这种方法来做。 2、常用备份命令 备份 MySQL 数据库的命令 mysqldump –h hostname –u username –p password databasename > backupfile.sql 备份 MySQL 数据库为带删除表的格式 备份 MySQL 数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有 数据库。 mysqldump -–add-drop-table –u username –p password databasename > backupfile.sql 美河学习在线 www.eimhe.com 直接将 MySQL 数据库压缩备份 mysqldump –h hostname –u username –p password databasename | gzip > backupfile.sql.gz 备份 MySQL 数据库某个(些)表 mysqldump –h hostname –u username –p password databasename specific_table1 specific_table2 > backupfile.sql 同时备份多个 MySQL 数据库 mysqldump –h hostname –u username –p password –databases databasename1 databasename2 databasename3 > multibackupfile.sql 仅仅备份数据库结构 mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql 备份服务器上所有数据库 mysqldump –all-databases > allbackupfile.sql 还原 MySQL 数据库的命令 mysql –h hostname –u username –p password databasename < backupfile.sql 还原压缩的 MySQL 数据库 gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename 将数据库转移到新服务器 mysqldump –u username –p password databasename | mysql –host=*.*.*.* -C databasename 使用下面的命令可以将 host1 上的 sourceDb 复制到 host2 的 targetDb,前提是 host2 主 机上已经创建 targetDb 数据库: mysqldump --host=host1 --opt sourceDb| mysql --host=host2 -C targetDb 3、恢复还原 用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据 导入。 直接用 mysql 客户端 例如: /usr/local/mysql/bin/mysql –u yejr –p yejr db_name < db_name.sql 美河学习在线 www.eimhe.com 用 SOURCE 语法 (实验不成功!!!) 其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如: SOURCE /tmp/db_name.sql; 这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的 文件。 [root@zzh /]# mysqlbinlog /beifeng/mysql-bin.000009 | mysql -u root -p db_name 完全恢复 [root@zzh /]# mysql -u root -p zzh < /beifeng/zzh.sql 恢复数据库时,数据库不受任何影响,注意:恢复的库时原库一定要存在 把数据恢复到最新状态 [root@zzh /]# mysqldump -F -u root -p kangte > /beifeng/kangte.sql 备份 kangte 数据库,加-F 生成一个新日志文件恢复时好查找,注意:一定要检查一下备份 的文件 这时备份以后数据库发生的操作都会记录到二进制日志里面 [root@zzh /]# cp /mysqldata/mysql-bin.000009 /beifeng/ 特别注意:一定要在恢复之前把日志文件拷贝出来,否则日志也会记录恢复操作,把从备份 生成后的所有二进制文件拷贝出来 [root@zzh /]# mysql -u root -p kangte < /beifeng/kangte.sql 执行完全恢复 kangte 数据库,恢复到备份数据库时的状态,此时备份时到数据库恢复之间 的操作还没有恢复 [root@zzh /]# mysqlbinlog /beifeng/mysql-bin.000009 | mysql -u root -p kangte 用二进制日志把 kangte 数据恢复到最新状态 不完全恢复 一、基于时间点恢复(如果 00:00:00——00:30:30 中间出现问题,可以跳过这段时间恢复数 据) 注意:恢复数据库之前最后把二进制文件备份一下 [root@zzh /]# mysqlbinlog --stop-date="2009-09-01 00:00:00" /mysqldata/mysql-bin.000009 | mysql -u root -p kangte 用二进制日志文件把 kangte 数据库恢复到故障前 [root@zzh /]# mysqlbinlog --start-date="2009-09-01 00:30:30" /mysqldata/mysql-bin.000009 | mysql -u root -p kangte 跳过故障时间点继续恢复 kangte 数据库 二、基于位置的恢复(可以更精确的恢复数据) [root@zzh /]# mysqlbinlog --start-date="2009-09-01 00:00:00" --stop-date="2009-09-01 00:30:30" /mysqldata/mysql-bin.000009 > /jilu.txt 根据二进制日志生成 00:00:00——00:30:30 中间的操作记录文件,这里记录的是对所有数据 美河学习在线 www.eimhe.com 库的操作 [root@zzh /]# more /jilu.txt 查看文件找出错误点前后对应的语句代号,如 at 1000 [root@zzh /]# mysqlbinlog --stop-position="1000" /mysqldata/mysql-bin.000009 | mysql -u root - p kangte 把 kangte 数据库恢复到代号为 1000 的语句前,注意:不恢复代号为 1000 的语句 [root@zzh /]# mysqlbinlog --start-position="1010" /mysqldata/mysql-bin.000009 | mysql -u root - p kangte 恢复代号为 1010 的语句之后的语句 4、mysqldump+mysqlbinlog 完全恢复 从 mysqldump 备份文件恢复数据会丢失掉从备份点开始的更新数据,所以还需要结合 mysqlbinlog 二进制日志增量备份。确保 my.ini 或者 my.cnf 中包含下面的配置以启用二进 制日志,或者 mysqld ---log-bin: [mysqld] log-bin=mysql-bin mysqldump 命令必须带上--flush-logs 选项以生成新的二进制日志文件: mysqldump --single-transaction --flush-logs --master-data=2 > backup.sql 这样生成的增量二进制日志文件比如为 mysql-bin.000003,那么恢复数据时如下: 1 2 shell> mysql –u root –p Pwd < backup_sunday_1_PM.sql shell> mysqlbinlog mysql-bin.000003 | mysql –u root –p Pwd 此外 mysqlbinlog 还可以指定--start-date、--stop-date、--start-position 和--stop-position 参数,用于精确恢复数据到某个时刻之前或者跳过中间某个出问题时间段恢复数据,直接 摘录 MySQL 文档说明中相关内容如下: 1、指定恢复时间 对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME 格式的起止时间。举例说明,假设在今天上午 10:00(今天是 2005 年 4 月 20 日),执行 SQL 语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入: mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 \ | mysql -u root -pmypwd 该命令将恢复截止到在--stop-date 选项中以 DATETIME 格式给出的日期和时间的所有数据。 如果你没有检测到几个小时后输入的错误的 SQL 语句,可能你想要恢复后面发生的活动。根 据这些,你可以用起使日期和时间再次运行 mysqlbinlog: 美河学习在线 www.eimhe.com mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 \ | mysql -u root -pmypwd \ 在该行中,从上午 10:01 登录的 SQL 语句将运行。组合执行前夜的转储文件和 mysqlbinlog 的两行可以将所有数据恢复到上午 10:00 前一秒钟。你应检查日志以确保时间确切。下一节 介绍如何实现。 2、指定恢复位置 也可以不指定日期和时间,而使用 mysqlbinlog 的选项--start-position 和--stop-position 来指定 日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位 置是更准确的恢复方法,特别是当由于破坏性 SQL 语句同时发生许多事务的时候。要想确定 位置号,可以运行 mysqlbinlog 寻找执行了不期望的事务的时间范围,但应将结果重新指向 文本文件以便进行检查。操作方法为: mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00" \ /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql 该命令将在/tmp 目录创建小的文本文件,将显示执行了错误的 SQL 语句时的 SQL 语句。你 可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于 停止和继续恢复操作,应进行注释。用 log_pos 加一个数字来标记位置。使用位置号恢复了 以前的备份文件后,你应从命令行输入下面内容: mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456 \ | mysql -u root -pmypwd mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456 \ | mysql -u root -pmypwd \ 上面的第 1 行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二 进制日志结束的所有事务。因为 mysqlbinlog 的输出包括每个 SQL 语句记录之前的 SET TIMESTAMP 语句,恢复的数据和相关 MySQL 日志将反应事务执行的原时间。 2、mysqlhotcopy mysqlhotcopy 是专门针对 myisam 数据表进行备份,备份的过程中,任何数据插入和更新操 作都会被挂起。 3、Xtrabackup 安装 下载地址: https://www.percona.com/downloads/XtraBackup/ http://www.cnblogs.com/Amaranthus/archive/2014/08/19/3922570.html#_Toc396231276 美河学习在线 www.eimhe.com http://willvvv.iteye.com/blog/1544043 http://www.cnblogs.com/cosiray/archive/2012/03/02/2376595.html http://blog.163.com/ji_1006/blog/static/10612341201382355716623/ http://www.jb51.net/article/55449.htm 1、理论概念 A、Xtrabackup 是什么 Xtrabackup 是一个对 InnoDB 做数据备份的工具,支持在线热备份(备份时不影响数据读 写),是商业备份工具 InnoDB Hotbackup 的一个很好的替代品。 Xtrabackup 有两个主要的工具:xtrabackup、innobackupex 1、xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,而不能备份 MyISAM 数据表 2、innobackupex 是参考了 InnoDB Hotbackup 的 innoback 脚本修改而来的.innobackupex 是一个 perl 脚本封装,封装了 xtrabackup。主要是为了方便的 同时备份 InnoDB 和 MyISAM 引擎的表,但在处理 myisam 时需要加一个读锁。并且加入了一些使用的选项。如 slave-info 可以记录备份恢 复后,作为 slave 需要的一些信息,根据这些信息,可以很方便的利用备份 来重做 slave。 3、官方文档:http://www.percona.com/docs/wiki/percona-xtrabackup:start B、Xtrabackup 可以做什么 在线(热)备份整个库的 InnoDB、 XtraDB 表 在 xtrabackup 的上一次整库备份基础上做增量备份(innodb only) 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用) MySQL 数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是 point-in- time(时间点)的恢复而不是增量备份。Xtrabackup 工具支持对 InnoDB 存储引擎的增量备份, 工作原理如下: (1)首先完成一个完全备份,并记录下此时检查点的 LSN(Log Sequence Number)。 (2)在进程增量备份时,比较表空间中每个页的 LSN 是否大于上次备份时的 LSN,如果 是,则备份该页,同时记录当前检查点的 LSN。 首先,在 logfile 中找到并记录最后一个 checkpoint(“last checkpoint LSN”),然后开始从 LSN 的位置开始拷贝 InnoDB 的 logfile 到 xtrabackup_logfile;接着,开始拷贝全部的数据文 件.ibd;在拷贝全部数据文件结束之后,才停止拷贝 logfile。 因为 logfile 里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过 了,恢复时仍然能够通过解析 xtrabackup_logfile 保持数据的一致。 C、Xtrabackup 备份原理 美河学习在线 www.eimhe.com XtraBackup 基于 InnoDB 的 crash-recovery 功能。它会复制 innodb 的 data file,由于不锁 表,复制出来的数据是不一致的,在恢复的时候使用 crash-recovery,使得数据恢复一致。 InnoDB 维护了一个 redo log,又称为 transaction log,事务日志,它包含了 innodb 数据 的所有改动情况。当 InnoDB 启动的时候,它会先去检查 data file 和 transaction log,并且会 做二步操作: XtraBackup 在备份的时候, 一页一页地复制 innodb 的数据,而且不锁定表,与此同时, XtraBackup 还有另外一个线程监视着 transactions log,一旦 log 发生变化,就把变化过的 log pages 复制走。为什么要急着复制走呢? 因为 transactions log 文件大小有限,写满之后,就 会从头再开始写,所以新数据可能会覆盖到旧的数据。 在 prepare 过程中,XtraBackup 使用复制到的 transactions log 对备份出来的 innodb data file 进行 crash recovery。 D、实现细节 XtraBackup 以 read-write 模式打开 innodb 的数据文件,然后对其进行复制。其实它不会 修改此文件。也就是说,运行 XtraBackup 的用户,必须对 innodb 的数据文件具有读写权限。 之所以采用 read-write 模式是因为 XtraBackup 采用了其内置的 innodb 库来打开文件,而 innodb 库打开文件的时候就是 rw 的。 XtraBackup 要从文件系统中复制大量的数据,所以它尽可能地使用 posix_fadvise(),来 告诉 OS 不要缓存读取到的数据,从 而提升性能。因为这些数据不会重用到了,OS 却没有 这么聪明。如果要缓存一下的话,几个 G 的数据,会对 OS 的虚拟内存造成很大的压力,其 它进程,比如 mysqld 很有可能被 swap 出去,这样系统就会受到很大影响了。 在备份 innodb page 的过程中,XtraBackup 每次读写 1MB 的数据,1MB/16KB=64 个 page。 这个不可配置。读 1MB 数据之 后,XtraBackup 一页一页地遍历这 1MB 数据,使用 innodb 的 buf_page_is_corrupted()函数检查此页的数据是否正常, 如果数据不正常,就重新读取这 一页,最多重新读取 10 次,如果还是失败,备份就失败了,退出。在复制 transactions log 的时候,每次读写 512KB 的数据。同样不可以配置。 2、下载安装 需要下载 linux-Generic 版本的,进行解压安装,下载 percona-xtrabackup-2.1.8-733-Linux- x86_64.tar.gz 版本,拷贝到/usr/local 目录下,然后解压,进入解压目录,把 bin 目录下面的 文件全部拷贝到/usr/bin 目录下面,完成安装。 1、解压安装 xtrabackup [root@rbdb-cs local]# cp percona-xtrabackup-2.1.8-733-Linux-x86_64.tar.gz /usr/local/ [root@rbdb-cs local]# tar -zxvf percona-xtrabackup-2.1.8-733-Linux-x86_64.tar.gz [root@rbdb-cs bin]# pwd /usr/local/percona-xtrabackup-2.1.8-Linux-x86_64/bin [root@rbdb-cs bin]# ls 美河学习在线 www.eimhe.com innobackupex innobackupex-1.5.1 xbcrypt xbstream xtrabackup xtrabackup_55 xtrabackup_56 [root@rbdb-cs bin]# cd .. [root@rbdb-cs percona-xtrabackup-2.1.8-Linux-x86_64]# pwd /usr/local/percona-xtrabackup-2.1.8-Linux-x86_64 [root@rbdb-cs percona-xtrabackup-2.1.8-Linux-x86_64]# cp bin/* /usr/bin/ 2、安装依赖包体 执行备份,报如下错误,需要安装一下依赖包体。 [root@rbdb-cs backup]# innobackupex --user=root --password=root --defaults- file=/usr/local/mysql/my.cnf /backup/mysql InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved. This software is published under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991. Get the latest version of Percona XtraBackup, documentation, and help resources: http://www.percona.com/xb/p 150720 07:16:12 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabac kup' as 'root' (using password: YES). innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /usr/bin/innobackupex line 2956. (1)安装 percona-toolkit 访问 http://www.percona.com/software/percona-toolkit/ 下载最新稳定的版本,进行安装。 [root@rbdb-cs db112]# rpm -Uvh percona-toolkit-2.2.10-1.noarch.rpm warning: percona-toolkit-2.2.10-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY error: Failed dependencies: perl(DBD::mysql) >= 1.0 is needed by percona-toolkit-2.2.10-1.noarch perl(IO::Socket::SSL) is needed by percona-toolkit-2.2.10-1.noarch 表示需要先安装其他的一下依赖包体。 (2)安装其他 Perl 相关的模块 yum install perl-DBI yum install perl-DBD-MySQL yum install perl-Time-HiRes yum install perl-IO-Socket-SSL 美河学习在线 www.eimhe.com (3)安装 percona-toolkit 安装完成完成以上 perl 相关包体后,在执行安装 percona-toolkit-2.2.10-1.noarch.rpm [root@rbdb-cs db112]# rpm -Uvh percona-toolkit-2.2.10-1.noarch.rpm warning: percona-toolkit-2.2.10-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY Preparing... ########################################### [100%] 1:percona-toolkit ########################################### [100%] (4)执行备份测试 [root@rbdb-cs db112]# innobackupex --user=root --password=root --defaults- file=/usr/local/mysql/my.cnf /backup/mysql InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved. This software is published under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991. Get the latest version of Percona XtraBackup, documentation, and help resources: http://www.percona.com/xb/p 150720 07:48:41 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabac kup' as 'root' (using password: YES). 150720 07:48:42 innobackupex: Connected to MySQL server 150720 07:48:42 innobackupex: Executing a version check against the server... 150720 07:48:43 innobackupex: Done. IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!". innobackupex: Using mysql server version 5.6.20-log innobackupex: Created backup directory /backup/mysql/2015-07-20_07-48-44 150720 07:48:44 innobackupex: Starting ibbackup with command: xtrabackup_56 --defaults- file="/usr/local/mysql/my.cnf" --defaults-group="mysqld" --backup --suspend-at-end --target- dir=/backup/mysql/2015-07-20_07-48-44 --tmpdir=/usr/local/mysql/data/tmpdir innobackupex: Waiting for ibbackup (pid=28200) to suspend innobackupex: Suspend file '/backup/mysql/2015-07-20_07-48-44/xtrabackup_suspended_2' xtrabackup_56 version 2.1.8 for MySQL server 5.6.15 Linux (x86_64) (revision id: 733) xtrabackup: uses posix_fadvise(). 美河学习在线 www.eimhe.com xtrabackup: cd to /usr/local/mysql/data xtrabackup: using the following InnoDB configuration: xtrabackup: innodb_data_home_dir = ./ xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend xtrabackup: innodb_log_group_home_dir = ./ xtrabackup: innodb_log_files_in_group = 2 xtrabackup: innodb_log_file_size = 50331648 >> log scanned up to (1756398) [01] Copying ./ibdata1 to /backup/mysql/2015-07-20_07-48-44/ibdata1 [01] ...done [01] Copying ./mysql/slave_master_info.ibd to /backup/mysql/2015-07-20_07-48- 44/mysql/slave_master_info.ibd [01] ...done [01] Copying ./mysql/slave_worker_info.ibd to /backup/mysql/2015-07-20_07-48- 44/mysql/slave_worker_info.ibd [01] ...done [01] Copying ./mysql/slave_relay_log_info.ibd to /backup/mysql/2015-07-20_07-48- 44/mysql/slave_relay_log_info.ibd [01] ...done [01] Copying ./mysql/innodb_table_stats.ibd to /backup/mysql/2015-07-20_07-48- 44/mysql/innodb_table_stats.ibd [01] ...done [01] Copying ./mysql/innodb_index_stats.ibd to /backup/mysql/2015-07-20_07-48- 44/mysql/innodb_index_stats.ibd [01] ...done [01] Copying ./test/test08.ibd to /backup/mysql/2015-07-20_07-48-44/test/test08.ibd [01] ...done [01] Copying ./test/test07.ibd to /backup/mysql/2015-07-20_07-48-44/test/test07.ibd [01] ...done >> log scanned up to (1756398) xtrabackup: Creating suspend file '/backup/mysql/2015-07-20_07-48- 44/xtrabackup_suspended_2' with pid '28200' 150720 07:48:46 innobackupex: Continuing after ibbackup has suspended 150720 07:48:46 innobackupex: Starting to lock all tables... 150720 07:48:46 innobackupex: All tables locked and flushed to disk 150720 07:48:46 innobackupex: Starting to backup non-InnoDB tables and files innobackupex: in subdirectories of '/usr/local/mysql/data' innobackupex: Backing up files '/usr/local/mysql/data/performance_schema/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM, ARZ,CSM,CSV,opt,par}' (53 files) >> log scanned up to (1756398) innobackupex: Backing up files 美河学习在线 www.eimhe.com '/usr/local/mysql/data/mysql/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,op t,par}' (74 files) innobackupex: Backing up file '/usr/local/mysql/data/test/db.opt' innobackupex: Backing up file '/usr/local/mysql/data/test/test08.frm' innobackupex: Backing up file '/usr/local/mysql/data/test/test07.frm' 150720 07:48:46 innobackupex: Finished backing up non-InnoDB tables and files 150720 07:48:46 innobackupex: Waiting for log copying to finish xtrabackup: The latest check point (for incremental): '1756398' xtrabackup: Stopping log copying thread. .>> log scanned up to (1756398) xtrabackup: Creating suspend file '/backup/mysql/2015-07-20_07-48-44/xtrabackup_log_copied' with pid '28200' xtrabackup: Transaction log of lsn (1756398) to (1756398) was copied. 150720 07:48:47 innobackupex: All tables unlocked innobackupex: Backup created in directory '/backup/mysql/2015-07-20_07-48-44' innobackupex: MySQL binlog position: filename 'binlog.000003', position 120 150720 07:48:47 innobackupex: Connection to database server closed 150720 07:48:47 innobackupex: completed OK! 4、Xtrabackup 备份命令 1、Xtrabackup 常用参数 1、--defaults-file=/usr/local/mysql/my.cnf 默认配置文件的路径,如果没有该参数,xtrabackup 将从依次从以下位置查找配置文件 /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并读取配置文件中的[mysqld] 和 [xtrabackup] 配 置 段 。 [mysqld] 中 只 需 要 指 定 datadir 、 innodb_data_home_dir 、 innodb_data_file_path 、 innodb_log_group_home_dir 、 innodb_log_files_in_group 、 innodb_log_file_size 该 6 个参数即可让 xtrabackup 正常工作。 2、--defaults-extra-file=/usr/local/etc/my.cnf 如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件。 3、--print-param 打印备份或恢复时需要的参数 4、--use-memory=# 美河学习在线 www.eimhe.com 该参数在 prepare 的时候使用,控制 prepare 时 innodb 实例使用的内存量 5、--suspend-at-end 在 target-dir 目录下产生一个 xtrabackup_suspended 文件,将 xtrabackup 进程挂起,不停地 将数据文件的变化同步到备份文件,直到用户手工删除 xtrabackup_suspended 文件 --throttle=# 每秒 IO 次数,限制 backup 时使用的 I/O 操作量,使备份对数据库正常业务的影响最小化 --log-stream 该参数在 backup 的时候使用,将 xtrabackup_logfile 的内容输出到标准输出,使用该参数时 会自动使用 suspend-at-end 参数,innobackupex 脚本的 stream 模式会使用该参数。 --incremental-lsn=name 增量备份时只拷贝 LSN 比该参数指定值新的 ibd pages,前次备份到了哪个 LSN 可以看前次 备份集的 xtrabackup_checkpoints 文件 --incremental-basedir=name 该参数在 backup 的时候使用,备份比该参数指定位置的备份集新的 idb pages --incremental-dir=name 该参数在 prepare 的时候使用,指定 prepare 时产生的.delta 文件和日志文件的存放路径 --tables=name 在备份 file-per-table 类型的数据文件时使用,使用正则表达式指定需要备份的 innodb 表 --datadir=name MySQL 数据库的数据文件目录。 2、xtrabackup 全备份与恢复 xtrabackup 只备份 InnoDB 数据文件,表结构是不备份的,所以恢复的时候,你必须有对应 表结构文件(.frm)。 shell>mkdir -p /backup/xtrabackup shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup 全量备份模拟恢复: 需要执行两次 xtrabackup –prepare shell>xtrabackup --defaults-file=/etc/my.cnf –prepare --target-dir=/backup/xtrabackup shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup 删除数据库目录下的数据文件: Shell>rm –rf /usr/local/mysql/var/ib* Shell>cp /backup/xtrabackup/ib* /usr/local/mysql/var Shell>chown –R mysql:mysq /usr/local/mysql/var 重启测试是否恢复成功。 Service mysql restart 美河学习在线 www.eimhe.com 注意,xtrabackup 只备份数据文件,并不备份数据表结构(.frm),所以使用 xtrabackup 恢复 的时候,你必须有对应表结构文件(.frm)。 3、xtrabackup 增量备份与恢复 增量备份优点: 1、数据库太大没有足够的空间全量备份,作增量备份有效节省空间,且效率高。 2、支持热备份。备份过程不锁表,不受时间限制,不影响用户使用。 3、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。 4、备份恢复基于文件操作,降低直接对数据库操作风险。 5、备份效率更高,恢复效率更高。 增量备份及模拟恢复步骤: shell>mkdir -p /backup/xtrabackup/base shell>mkdir -p /backup/xtrabackup/delta (1)先做一次全量备份,因为后面的增量备份要以此为基础 shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base shell>ls /backup/xtrabackup/base ibdata1 xtrabackup_checkpoints xtrabackup_logfile (2)以此全量备份为基础进行增量备份 Shell> xtrabackup --defaults=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/delta/ -- incremental-basedir=/backup/xtrabackup/base/ shell>ls /backup/xtrabackup/delta ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile ps:在增量备份的目录下,数据文件都是以.delta 结尾的。增量备份只备份上一次全量备份 后被修改过的 page,所以增量备份只暂用较少的空间。 增量备份可以在增量备份的基础上增量。 (注:/backup/xtrabackup/delta/是每次都需修改的。比如第二次增量就改成 /backup/xtrabackup/delta2,当然可以写个脚本进行自动备份) 增量备份模拟恢复过程: 我们需要分别对全量、增量备份各做一次 prepare 操作。 shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/ shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/ --incremental-dir=/backup/xtrabackup/delta/ shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/ 美河学习在线 www.eimhe.com shell>rm –rf /usr/local/mysql/var/ib* #删除原来数据目录下的数据文件 Shell>cp /backup/xtrabackup/base/ib* /usr/local/mysql/var Shell>chown –R mysql.root /usr/local/mysql/var 重启后测试是否成功。 再次提醒,xtrabackup 只备份 InnoDB 数据文件,表结构是不备份的,所以恢复的时候,你 必须有对应表结构文件(.frm)。 对比 innobackupex 和 xtrabackup 我们可以看到,innobackupex 操作起来更方便,但是 innobackupex 会有短暂的锁 表(时间依赖于 MyISAM 大小)。xtrabackup 备份还有另一个 重要特性:增量备份。(未来的版本 innobackupex 也可能增长该功能) 比如表中目前有 10 条数据,先备份.备份到/usr/local/backup/1/目录 (完整备份) shell> xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/1/ 查看它的 lsn 点: shell> cat xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0:0 to_lsn = 0:592411 再向表中插入数据,增量备份 shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/2/ -- incremental-basedir=/usr/local/backup/1/ 把增量备份到 2(1 到 2 的增量备份) 查看它的 lsn 点: shell>cat xtrabackup_checkpoints backup_type = incremental from_lsn = 0:592411 to_lsn = 0:908563 再向表中插入数据,增量备份 shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ -- incremental-basedir=/usr/local/backup/1/ 把增量备份到 3(1 到 3 的增量备份,2 的备份已经包含在里面了,按照这种方式备份的话,最后 的还原只需要还原完全备份和最后一份增量备份即可) 查看它的 lsn 点: shell>cat xtrabackup_checkpoints backup_type = incremental from_lsn = 0:592411 to_lsn = 0:1507854 或则另一种增量备份方式: shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ -- incremental-basedir=/usr/local/backup/2/ 把增量备份到 3(2 到 3 的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原 需要还原完全备份和各个增量备份) 美河学习在线 www.eimhe.com 查看它的 lsn 点: shell>cat xtrabackup_checkpoints backup_type = incremental from_lsn = 0:908563 to_lsn = 0:1507854 增量备份模拟恢复: 我们需要分别对全量、增量备份各做一次 prepare 操作。 ①:基于(1 到 3 的增量备份,2 的备份已经包含在里面了,按照这种方式备份的话,最后的还原 只需要还原完全备份和最后一份增量备份即可) 把第 1 次的完备恢复 shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/ 继续把增量备份恢复上去 shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/ shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ 恢复完成 接着 cd /usr/local/backup/1/ cp 1/ib* /usr/local/mysql/var/ chown –R mysql.root /usr/local/mysql/var /etc/init.d/mysql restart ②基于(2 到 3 的增量备份,各个增量备份独立,按照这种方式备份的话,最后的还原需要还原 完全备份和各个增量备份) 把第 1 次的完备恢复 xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/ 继续把增量备份恢复上去 shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/2/ 继续把增量备份恢复上去 shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/ 恢复完成 接着 cd /usr/local/backup/1/ cp 1/ib* /usr/local/mysql/var/ chown –R mysql.root /usr/local/mysql/var /etc/init.d/mysql restart 美河学习在线 www.eimhe.com 5、innobackupex 备份命令 1、常用参数说明 innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [-- password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timestamp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [- -stream=tar] [--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [-- ibbackup=IBBACKUP-BINARY] BACKUP-DIR innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR 各参数说明: --defaults-file 默认配置文件的路径,如果没有该参数,xtrabackup 将从依次从以下位置查找配置文件 /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并读取配置文件中的[mysqld] 和 [xtrabackup] 配 置 段 。 [mysqld] 中 只 需 要 指 定 datadir 、 innodb_data_home_dir 、 innodb_data_file_path 、 innodb_log_group_home_dir 、 innodb_log_files_in_group 、 innodb_log_file_size 该 6 个参数即可让 xtrabackup 正常工作。 --apply-log 对 xtrabackup 的--prepare 参数的封装 --copy-back 做数据恢复时将备份数据文件拷贝到 MySQL 服务器的 datadir ; --remote-host=HOSTNAME 通过 ssh 将备份数据存储到进程服务器上; --stream=[tar] 备份文件输出格式, tar 时使用 tar4ibd , 该文件可在 XtarBackup binary 文件中获得.如果备份 时有指定--stream=tar, 则 tar4ibd 文件所处目录一定要在$PATH 中(因为使用的是 tar4ibd 去压 缩, 在 XtraBackup 的 binary 包中可获得该文件)。 在使用参数 stream=tar 备份的时候,你的 xtrabackup_logfile 可能会临时放在/tmp 目录下, 美河学习在线 www.eimhe.com 如果你备份的时候并发写入较大的话 xtrabackup_logfile 可能会很大(5G+),很可能会撑满你 的/tmp 目录,可以通过参数--tmpdir 指定目录来解决这个问题。 --tmpdir=DIRECTORY 当有指定--remote-host or --stream 时, 事务日志临时存储的目录, 默认采用 MySQL 配置文件 中所指定的临时目录 tmpdir --redo-only --apply-log 组, 强制备份日志时只 redo ,跳过 rollback。这在做增量备份时非常必要。 --use-memory=# 该参数在 prepare 的时候使用,控制 prepare 时 innodb 实例使用的内存量 --throttle=IOS 同 xtrabackup 的--throttle 参数 --sleep=是给 ibbackup 使用的,指定每备份 1M 数据,过程停止拷贝多少毫秒,也是为了在 备份时尽量减小对正常业务的影响,具体可以查看 ibbackup 的手册 ; --compress[=LEVEL] 对备份数据迚行压缩,仅支持 ibbackup,xtrabackup 还没有实现; --include=REGEXP 对 xtrabackup 参数--tables 的封装,也支持 ibbackup。备份包含的库表,例如:--include="test.*", 意思是要备份 test 库中所有的表。如果需要全备份,则省略这个参数;如果需要备份 test 库 下的 2 个表:test1 和 test2,则写成:--include="test.test1|test.test2"。也可以使用通配符,如: --include="test.test*"。 --databases=LIST 列出需要备份的 databases,如果没有指定该参数,所有包含 MyISAM 和 InnoDB 表的 database 都会被备份; --uncompress 解压备份的数据文件,支持 ibbackup,xtrabackup 还没有实现该功能; --slave-info, 备份从库, 加上--slave-info 备份目录下会多生成一个 xtrabackup_slave_info 文件, 这里会保 存 主 日 志 文 件 以 及 偏 移 , 文 件 内 容 类 似 于 :CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0 美河学习在线 www.eimhe.com --socket=SOCKET 指定 mysql.sock 所在位置,以便备份进程登录 mysql. --user=root 备份操作用户名,一般都是 root 用户 --password=root123 密码 --host=172.17.210.112 主机 ip,本地可以不加 --parallel=4 --throttle=400 并行个数,根据主机配置选择合适的,默认是 1 个,多个可以 加快备份速度。 --stream=tar 压缩类型,这里选择 tar 格式,可以加,可不加。加上文件就小一点,在 备份的时候就已经打包好了。 2、innobackupex 全备份恢复 innobackupex --database="testinnodb test" --user=root --no-lock --defaults- file=/data0/mysql/my.cnf /data0/backup/mysql 2>/tmp/mysqlbackup.log 注 : 使 用 mysql 的 root 用 户 将 数 据 库 testinnodb 和 test 的 备 份 , 备 份 路 径 是 /data0/backup/mysql/。备份 成功后会在该目录下将创建以时间戳为名称的备份目录。no- lock 参数用于指定备份时不锁定表。2>/tmp/mysqlbackup.log 是 将备份过程中的输出信息保 存到/tmp/mysqlbackup.log 中。 innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --database=zztx -- stream=tar /data/back_data/ 2>/data/back_data/zztx.log | gzip 1>/data/back_data/zztx.tar.gz 说明: --database=zztx 单独对 zztx 数据库做备份 ,若是不添加此参数那就那就是对全库做 备份 2>/data/back_data/zztx.log 输出信息写入日志中 1>/data/back_data/zztx.tar.gz 打包压缩存储到该文件中 shell> mkdir -p /backup/innobackupex/ Shell>innobackupex --defaults-file=/etc/my.cnf --user=root --password=root \ --databases='i_db' --no-lock /backup/ innobackupex / \ 2> /tmp/innobackup.log xtrabackup_51 Ver 1.5 Rev undefined for 5.1.52 unknown-linux-gnu (x86_64) [01] Copying /usr/local/mysql/var/ibdata1 to /backup/innobackupex/2011-04-12_00-44-29/ibdata1 [01] ...done xtrabackup: The latest check point (for incremental): '0:32538662' xtrabackup: Stopping log copying thread. xtrabackup: Transaction log of lsn (0 32538662) to (0 32538662) was copied. 美河学习在线 www.eimhe.com 注释: 使用 mysql 的 root 用户备份,密码为 root 备份文件的存放路径是/backup/innobackupex/,该目录下将创建以时间戳为名称的备份目录 –no-lock 备份时不锁定表 –databases="i_db"用于指定要备份的数据库 2>/tmp/backup.log 是将备份过程中的输出信息保存到/tmp/backup.log 注意:在使用 innobackupex 进行备份时,在配置文件 my.cnf 中要明确指定 mysql 的数据文 件目录,否则会报错。 [mysqld] datadir=/usr/local/mysql/var (2)打包(tar)备份 Shell>innobackupex --defaults-file=/etc/my.cnf --user=root --password=root \ --databases='i_db' --no-lock --stream=tar /backup/innobackupex/ \ 2> /tmp/innobackup.log 1> /backup/innobackupex/i_aura.tar 这种备份时间会比较长,主要是执行打包操作。 解包过程,需要使用 tar ixvf 解压对应的文件后,注意参数 –i 必须加入。 模拟恢复过程: Shell> mysql –uroot –proot –e’drop database i_db’ Shell>mysqladmin –uroot –proot shutdown Shell>rm –rf /usr/local/mysql/var/ib * shell >cd /backup/innobackupex/ shell >tar ixvf i_aura.tar shell>ls backup- my.cnf i_aura.tar ibdata1 i_db stderr stdout xtrabackup_binary xtrabackup_checkpoints xtraba ckup_logfile 准备还原 shell>innobackupex-1.5.1 --defaults-file=/etc/my.cnf –no-lock –apply-log /data/back_data/ 拷贝还原数据: shell>innobackupex --defaults-file=/etc/my.cnf –no-lock --copy-back /backup/innobackupex/ Shell>cd /usr/local/mysql/var Shell>chown -R mysql:root . #一定要修改权限 shell> mysqld_safe –user=mysql & 检查删除的数据库,如果恢复则证明该恢复过程无误。 美河学习在线 www.eimhe.com (3)压缩(tar)备份 Shell>innobackupex --defaults-file=/etc/my.cnf --user=root --password=root \ --databases=”i_db test”--no-lock --stream=tar /backup/innobackupex/ \ 2> /tmp/innobackup.log | gzip > /backup/innobackupex/i_aura.tar 这种备份时间会比较长,主要是执行压缩操作。 解压缩过程,需要使用 tar izxvf 解压对应的文件后,注意参数 –i 必须加入。 还原: 使用 tar –izxvf 解压对应的文件后,操作完全同普通备份。 模拟恢复过程: Shell> mysql –uroot –proot –e’drop database i_db’ Shell>mysqladmin –uroot –proot shutdown Shell>rm –rf /usr/local/mysql/var/ibdata1 ib_logfile* shell >cd /backup/innobackupex/ shell >tar ixvf i_aura.tar shell>ls backup- my.cnf i_aura.tar.gz ibdata1 i_db stderr stdout xtrabackup_binary xtrabackup_checkpoints xtr abackup_logfile 准备还原: shell> innobackupex --defaults-file=/etc/my.cnf –no-lock --apply-log /backup/innobackupex/…… 拷贝还原数据: shell> innobackupex --defaults-file=/etc/my.cnf –no-lock --copy-back /backup/innobackupex/ Shell>cd /usr/local/mysql/var Shell>chown -R mysql:root . shell> mysqld_safe –user=mysql & 检查删除的数据库,如果恢复则证明该恢复过程无误。 (4)整库备份及恢复。 备份: Shell>innobackupex --user=root --password=root --defaults-file=/etc/my.cnf \ /backup/innobackupex/ 检查备份的文件: Shell>ls /backup/innobackupex/ 2011-04-12_09-20-13 模拟恢复: 美河学习在线 www.eimhe.com 首先停掉数据库,然后删除数据库目录下的所有数据库文件。 Shell> mysql –uroot –proot shutdown Shell>rm –rf /usr/local/mysql/var/* 首先写日志文件,然后恢复,如下。(注:2011-04-12_09-20-13 是自动生成的以备份时间 命名的文件夹,恢复时根据情况进行选择) Shell>innobackupex --apply-log --defaults-file=/etc/my.cnf \ /backup/innobackupex/2011-04-12_09-20-13 Shell>innobackupex --copy-back --defaults-file=/etc/my.cnf \ /backup/innobackupex/2011-04-12_09-20-13 使用 cd 或者 ls 命令看看你的数据库目录下是不是有文件了? 修改数据库文件权限,否则无法启动。(这步我是 cd 到原数据库目录下进行的) Shell>chown -R mysql:mysql . 重启数据库,测试恢复是否成功 3、innobackupex 增量备份恢复 1、增量备份实例 1 1,创建测试数据库和表 查看复制打印? 1. create database backup_test; //创建库 2. 3. CREATE TABLE `backup` ( //创建表 4. `id` int(11) NOT NULL AUTO_INCREMENT , 5. `name` varchar(20) NOT NULL DEFAULT '' , 6. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP , 7. `del` tinyint(1) NOT NULL DEFAULT '0', 8. PRIMARY KEY (`id`) 9. ) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 2,增量备份 查看复制打印? 1. mysql> INSERT INTO backup (name) VALUES ('tank'),('tank1'); //插入数据 2. 3. # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental- basedir=/home/tank/backup/2014-09-18_16-35-12 -- incremental /home/tank/backup/ 3,在增量的基础上在进行增量备份 查看复制打印? 1. mysql> INSERT INTO backup (name) VALUES ('tank2'),('tank3'),('tank4'),('tank5 '),('tank6'); //在插入数据 美河学习在线 www.eimhe.com 2. 3. //2014-09-18_18-05-20 这个目录,上次增量备份产生的目录 4. # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental- basedir=/home/tank/backup/2014-09-18_18-05-20 -- incremental /home/tank/backup/ 查看增量备份记录文件: 查看复制打印? 1. [root@localhost 2014-09-18_16-35-12]# cat xtrabackup_checkpoints //全备目录 下的文件 2. backup_type = full-prepared 3. from_lsn = 0 //全备起始为 0 4. to_lsn = 23853959 5. last_lsn = 23853959 6. compact = 0 7. 8. [root@localhost 2014-09-18_18-05-20]# cat xtrabackup_checkpoints //第一次增量 备份目录下的文件 9. backup_type = incremental 10. from_lsn = 23853959 11. to_lsn = 23854112 12. last_lsn = 23854112 13. compact = 0 14. 15. [root@localhost 2014-09-18_18-11-43]# cat xtrabackup_checkpoints //第二次增量 备份目录下的文件 16. backup_type = incremental 17. from_lsn = 23854112 18. to_lsn = 23854712 19. last_lsn = 23854712 20. compact = 0 增量备份做完后,把 backup_test 这个数据库删除掉,drop database backup_test;这样可 以对比还原后 4,增量还原 1. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo- only /home/tank/backup/2014-09-18_16-35-12 2. 3. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo- only /home/tank/backup/2014-09-18_16-35-12 --incremental- dir=/home/tank/backup/2014-09-18_18-05-20 4. 5. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo- only /home/tank/backup/2014-09-18_16-35-12 --incremental- dir=/home/tank/backup/2014-09-18_18-11-43 美河学习在线 www.eimhe.com 在这里有三个目录, 1),/home/tank/backup/2014-09-18_16-35-12,全备份目录 2),/home/tank/backup/2014-09-18_18-05-20,第一次增量备份产生的目录 3),/home/tank/backup/2014-09-18_18-11-43,第二次增量备份产生的目录 到这里增量还原,还没有结束,还有最重要一步,就是要进行一次全量还原。停止数据库,删 除/var/lib/mysql,在还原。 增量备份的原理就是,把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的 还原。 总体来说,innobackupex 速度快,支持 innodb,myisam,用起来是还不是很方便,单库还 原,还是增量备份还原,都要进行全部数据库还原,这个不合理。 2、增量备份实例 2 1、创建测试数据库和表 复制代码 代码如下: create database backup_test; //创建库 CREATE TABLE `backup` ( //创建表 `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(20) NOT NULL DEFAULT '' , `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP , `del` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 2、增量备份 复制代码 代码如下: mysql> INSERT INTO backup (name) VALUES ('tank'),('tank1'); //插入数据 # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/h ome/tank/backup/2014-09-18_16-35-12 --incremental /home/tank/backup/ 美河学习在线 www.eimhe.com 3、在增量的基础上在进行增量备份 复制代码 代码如下: mysql> INSERT INTO backup (name) VALUES ('tank2'),('tank3'),('tank4'),('tank5 '),('tank6'); //在插入数据 //2014-09-18_18-05-20 这个目录,上次增量备份产生的目录 # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/h ome/tank/backup/2014-09-18_18-05-20 --incremental /home/tank/backup/ 查看增量备份记录文件: 复制代码 代码如下: [root@localhost 2014-09-18_16-35-12]# cat xtrabackup_checkpoints //全备目录 下的文件 backup_type = full-prepared from_lsn = 0 //全备起始为 0 to_lsn = 23853959 last_lsn = 23853959 compact = 0 [root@localhost 2014-09-18_18-05-20]# cat xtrabackup_checkpoints //第一次增量 备份目录下的文件 backup_type = incremental from_lsn = 23853959 to_lsn = 23854112 last_lsn = 23854112 compact = 0 美河学习在线 www.eimhe.com [root@localhost 2014-09-18_18-11-43]# cat xtrabackup_checkpoints //第二次增量 备份目录下的文件 backup_type = incremental from_lsn = 23854112 to_lsn = 23854712 last_lsn = 23854712 compact = 0 增量备份做完后,把 backup_test 这个数据库删除掉,drop database backup_test;这样可以对 比还原后。 4、增量还原 复制代码 代码如下: # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 --incremental-dir=/home/tank/backup/2014- 09-18_18-05-20 # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 --incremental-dir=/home/tank/backup/2014- 09-18_18-11-43 在这里有三个目录: 1)、/home/tank/backup/2014-09-18_16-35-12,全备份目录 2)、/home/tank/backup/2014-09-18_18-05-20,第一次增量备份产生的目录 3)、/home/tank/backup/2014-09-18_18-11-43,第二次增量备份产生的目录 到这里增量还原,还没有结束,还有最重要一步,就是要进行一次全量还原。停止数据库, 删除/var/lib/mysql,在还原。 增量备份的原理就是,把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量 的还原。 总体来说,innobackupex 速度快,支持 innodb,myisam,用起来是还不是很方便,单库还原, 还是增量备份还原,都要进行全部数据库还原,这个不合理。 美河学习在线 www.eimhe.com 4、innobackupex 远程备份恢复 innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no- lock --stream=tar /data0/backup/mysql/|ssh root@192.168.1.101 cat ">"/data0/backup.tar 说明:备份当前机器下的数据到 192.168.1.101 的/data0/目录下。 (1)innobackupex 远程备份方法一 当前数据库所在机器 IP:192.168.1.131,现在要备份到 192.168.1.132 的/data 目录下。 Shell>innobackupex --user=root --password=root --defaults=/etc/my.cnf --stream=tar /data | ssh root@192.168.1.132 cat " >" /data/backup.tar 接着需要输入远程服务器密码......然后就开始备份了,备份完成后登陆到远程服务器看看 是不是有了呢? 目前使用 xtrabackup 增量备份是不支持到远程的。如何解决呢?可以使用 nfs 网络文件系 统把远程服务器磁盘挂载到本地。 (2)innobackupex 远程备份方法二 #在本地后台启动 1234 监听,以便接受备份文件 nc -d -l 1234 > /data/$A/20100118000001.tar & #ssh 到服务器 A 执行备份,并将备份包推送到备份机 B 上。同时记录下 log。 ssh $A ‘innobackupex-1.5.1 –stream=tar –include=’renren.*’ –throttle=500 – socket=/data/mysql/backup/mysql.sock –defaults-file=/data/dbbackup/my.cnf –user=root – password=xxxxxxx –slave-info /data/dbbackup | nc $B 1234′ < /dev/null > /data/xtrabackup.log 2>&1 参数解释: –stream=tar : 告诉 xtrabackup,备份需要以 tar 的文件流方式输出。 –include=’renren.*’:备份包含的库表,如例:意思是要备份 renren 库中所有的表。如果需 要全备份,则省略这个参数;如果需 要备份 renren 库下的 2 个表:tableA & tableB,则写 成:–include=’renren.tableA|renren.tableB’;再如果 renren 库下只有 2 个前缀是 table 的表, 你还可以写成:–include=’renren.table*’。 –throttle=500:xtrabackup 在备份过程中,IO 操作比较多,因此需要限定一下 IO 操作。以免 服务器压力过大,不过好像作用不太明显,也不知道是不是设置的还是过大。待测… –socket=/data/mysql/backup/mysql.sock:指定 mysql.sock 所在位置,以便备份进程登录 mysql. –defaults-file=/data/dbbackup/my.cnf :如果您的/etc/my.cnf 中没有使用如[mysqld3306]的片段 启动 mysql,则不需要这行参数,如果使用了上面的片段,那么 xtrabackup 是无法解析 /etc/my.cnf 文件的(严格上来说是会解析错误),所以,我们需要手工完成一个 my.cnf 文 美河学习在线 www.eimhe.com 件,文件片段如下, 只需要指定 6 个参数即可让 xtrabackup 正常工作,各参数意思请参考 mysql 文档: [mysqld] datadir=/data/var innodb_data_home_dir = /data/ibdata innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend innodb_log_group_home_dir = /data/iblogs innodb_log_files_in_group = 2 innodb_log_file_size = 1G 12、mysql 字符集 1、字符集问题 1、数据库字符集 编译安装时用户的命令包含字符集,-DDEFAULT_CHARSET=utf8 、- DDEFAULT_COLLATION=utf8_general_ci: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DINSTALL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ 查看字符集的变量信息如下: mysql> show variables like '%char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | 美河学习在线 www.eimhe.com | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec) 2、遇到的问题 在 test 数据库下创建表,插入英文没有问题,插入中文时候出现错误: mysql> create table test07(name varchar(20),sex char(1)); mysql> insert into test07 values("duting","M"); mysql> insert into test07 values("杜杜","M"); ERROR 1366 (HY000): Incorrect string value: '\xE6\x9D\x9C\xE6\x9D\x9C' for column 'name' at row 1 网上找原因,是字符集的问题,执行 alter table test07 modify name varchar(20) character set gbk;后,可以插入中文,然后再执行 mysql> alter table test07 modify name varchar(20) character set utf8;,再次插入中文,没有报错。 mysql> alter table test07 modify name varchar(20) character set gbk; Query OK, 1 row affected (0.07 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into test07 values("杜杜","M"); Query OK, 1 row affected (0.01 sec) mysql> alter table test07 modify name varchar(20) character set utf8; Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from test07; +--------+------+ | name | sex | +--------+------+ | duting | M | | 杜杜 | M | +--------+------+ 2 rows in set (0.00 sec) mysql> insert into test07 values("杜杜","M"); Query OK, 1 row affected (0.00 sec) 美河学习在线 www.eimhe.com mysql> select * from test07; +--------+------+ | name | sex | +--------+------+ | duting | M | | 杜杜 | M | | 杜杜 | M | +--------+------+ 3 rows in set (0.00 sec) mysql> insert into test07 values("张张","M"); Query OK, 1 row affected (0.01 sec) mysql> select * from test07; +--------+------+ | name | sex | +--------+------+ | duting | M | | 杜杜 | M | | 杜杜 | M | | 张张 | M | +--------+------+ 4 rows in set (0.00 sec) 2、字符集介绍 1、字符集理论 最近,在项目组使用的 mysql 数据库中,插入数据出现乱码,关于这个问题做了下总结,我们 从最基本的地方说起,到错误产生的深层次原因和解决办法。 基本概念 • 字符(Character)是指人类语言中最小的表义符号。例如’A'、’B'等; • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符 的编码(Encoding)。例如,我们给字符’A'赋予数值 0,给字符’B'赋予数值 1,则 0 就是字 符’A'的编码; • 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集 (Character Set)。例如,给定字符列表为{’A',’B'}时,{’A'=>0, ‘B’=>1}就是一个字符 集; • 字符序(Collation)是指在同一字符集内字符之间的比较规则; • 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系; 美河学习在线 www.eimhe.com • 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字 符序(Default Collation); • MySQL 中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写 不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序 “utf8_general_ci”下,字符“a”和“A”是等价的; MySQL 字符集设置 • 系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – character_set_connection:连接层字符集 – character_set_results:查询结果字符集 – character_set_database:当前选中数据库的默认字符集 – character_set_system:系统元数据(字段名等)字符集 – 还有以 collation_开头的同上面对应的变量,用来描述字符序。 • 用 introducer 指定文本字符串的字符集: – 格式为:[_charset] ’string’ [COLLATE collation] – 例如: SELECT _latin1 ’string’; SELECT _utf8 ‘你好’ COLLATE utf8_general_ci; – 由 introducer 修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集 处理。 MySQL 中的字符集转换过程 1. MySQL Server 收到请求时将请求数据从 character_set_client 转换为 character_set_connection; 2. 进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,其确 定方法如下: - 使用每个数据字段的 CHARACTER SET 设定值; - 若上述值不存在,则使用对应数据表的 DEFAULT CHARACTER SET 设定值(MySQL 扩展,非 SQL 标准); - 若上述值不存在,则使用对应数据库的 DEFAULT CHARACTER SET 设定值; - 若上述值不存在,则使用 character_set_server 设定值。 3. 将操作结果从内部操作字符集转换为 character_set_results。 我们现在回过头来分析下我们产生的乱码问题: a 我们的字段没有设置字符集,因此使用表的数据集 b 我们的表没有指定字符集,默认使用数据库存的字符集 c 我们的数据库在创建的时候没有指定字符集,因此使用 character_set_server 设 定值 美河学习在线 www.eimhe.com d 我们没有特意去修改 character_set_server 的指定字符集,因此使用 mysql 默认 e mysql 默认的字符集是 latin1,因此,我们使用了 latin1 字符集,而我们 character_set_connection 的字符集是 UTF-8,插入中文乱码也再所难免了。 常见问题解析 • FAQ-1 向默认字符集为 utf8 的数据表插入 utf8 编码的数据前没有设置连接字符集,查询 时设置连接字符集为 utf8 – 插入时根据 MySQL 服务器的默认设置,character_set_client、 character_set_connection 和 character_set_results 均为 latin1; – 插入操作的数据将经过 latin1=>latin1=>utf8 的字符集转换过程,这一过程中每个插 入的汉字都会从原始的 3 个字节变成 6 个字节保存; – 查询时的结果将经过 utf8=>utf8 的字符集转换过程,将保存的 6 个字节原封不动返 回,产生乱码。参考下图: • 向默认字符集为 latin1 的数据表插入 utf8 编码的数据前设置了连接字符集为 utf8(我们遇 到的错误就是属于这一种) – 插入时根据连接字符集设置,character_set_client、character_set_connection 和 character_set_results 均为 utf8; --插入数据将经过 utf8=>utf8=>latin1 的字符集转换,若原始数据中含有 \u0000~\u00ff 范围以外的 Unicode 字符,会因为无法在 latin1 字符集中表示而被转换为 “?”(0×3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。转换过程如下 图: 检测字符集问题的一些手段 • SHOW CHARACTER SET; • SHOW COLLATION; • SHOW VARIABLES LIKE ‘character%’; • SHOW VARIABLES LIKE ‘collation%’; • SQL 函数 HEX、LENGTH、CHAR_LENGTH • SQL 函数 CHARSET、COLLATION 使用 MySQL 字符集时的建议 • 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于 MySQL 的默认设置,否则 MySQL 升级时可能带来很大困扰; • 数据库和连接字符集都使用 latin1 时,虽然大部分情况下都可以解决乱码问题,但缺点 是无法以字符为单位来进行 SQL 操作,一般情况下将数据库和连接字符集都置为 utf8 是较好 的选择; • 使用 mysql CAPI(mysql 提供 C 语言操作的 API)时,初始化数据库句柄后马上用 mysql_options 设定 MYSQL_SET_CHARSET_NAME 属性为 utf8,这样就不用显式地用 SET NAMES 语句指定连接字符集,且用 mysql_ping 重连断开的长连接时也会把连接字符集 重置为 utf8; • 对于 mysql PHP API,一般页面级的 PHP 程序总运行时间较短,在连接到数据库以后 显式用 SET NAMES 语句设置一次连接字符集即可;但当使用长连接时,请注意保持连接通畅 美河学习在线 www.eimhe.com 并在断开重连后用 SET NAMES 语句显式重置连接字符集。 其他注意事项 • my.cnf 中的 default_character_set 设置只影响 mysql 命令连接服务器时的连接字符 集,不会对使用 libmysqlclient 库的应用程序产生任何作用! • 对字段进行的 SQL 函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的 影响。 • SQL 语句中的裸字符串会受到连接字符集或 introducer 设置的影响,对于比较之类的操 作可能产生完全不同的结果,需要小心! 总结 根据上面的分析和建议,我们解决我们遇到问题应该使用什么方法大家心里应该比较清楚 了。对,就是在创建 database 的时候指定字符集,不要去通过修改默认配置来达到目的,当 然你也可以采用指定表的字符集的形式,但很容易出现遗漏,特别是在很多人都参与设计的时 候,更容易纰漏。 虽然不提倡通过修改 mysql 的默认字符集来解决,但对于如何去修改默认字符集,我这里 还是给出一些方法,仅供大家参考。 MySQL 默认字符集 MySQL 对于字符集的指定可以细化到一个数据库,一张表,一列.传统的程序在创建数据库和 数据表时并没有使用那么复杂的配置,它们用的是默认的配置. (1)编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1; (2)安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指 定,这个值继承自编译时指定的; (3)启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值 继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集; (4)安装 MySQL 选择多语言支持,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,保证缺省情况下所有的数据库所有表的所有列的都 用 UTF-8 存储。 查看默认字符集 (默认情况下,mysql 的字符集是 latin1(ISO_8859_1),如何查看在上面我们已经给出了 相关命令 修改默认字符集 (1) 最简单的修改方法,就是修改 mysql 的 my.ini 文件中的字符集键值, 如 default-character-set = utf8 character_set_server = utf8 修改完后,重启 mysql 的服务 (2) 还有一种修改字符集的方法,就是使用 mysql 的命令 mysql> SET character_set_client = utf8 ; mysql> SET character_set_connection = utf8 ; mysql> SET character_set_database = utf8 ; mysql> SET character_set_results = utf8 ; mysql> SET character_set_server = utf8 ; 美河学习在线 www.eimhe.com mysql> SET collation_connection = utf8 ; mysql> SET collation_database = utf8 ; mysql> SET collation_server = utf8 ; 设置了表的默认字符集为 utf8 并且通过 UTF-8 编码发送查询,存入数据库的仍然是乱 码。那 connection 连接层上可能出了问题。解决方法是在发送查询前执行一下下面这句: SET NAMES 'utf8';它相当于下面的三句指令: SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8; 2、默认字符集问题 尽量使用 utf8 或者 gbk(-DDEFAULT_CHARSET=utf8、-DDEFAULT_COLLATION=utf8_general_ci 或 者 -DDEFAULT_CHARSET=gbk、-DDEFAULT_COLLATION=utf8_general_ci) 编译安装时候指定了-DDEFAULT_CHARSET=utf8、-DDEFAULT_COLLATION=utf8_general_ci 参数, 系统字符集变量如下所示: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DINSTALL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ mysql> show variables like 'char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ +--------------------------+----------------------------------+ 8 rows in set (0.00 sec) 美河学习在线 www.eimhe.com • 系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – character_set_connection:连接层字符集 – character_set_results:查询结果字符集 – character_set_database:当前选中数据库的默认字符集 – character_set_system:系统元数据(字段名等)字符集 – 还有以 collation_开头的同上面对应的变量,用来描述字符序。 • 用 introducer 指定文本字符串的字符集: – 格式为:[_charset] ’string’ [COLLATE collation] – 例如: SELECT _latin1 ’string’; SELECT _utf8 ‘你好’ COLLATE utf8_general_ci; – 由 introducer 修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集 处理。 服务器字符集 (character_set_server) 数据库字符集 (character_set_database) 数据库系统(character_set_system) character_set_server: 服务器安装时指定的默认字符集设定。 character_set_database: 数据库服务器中某个库使用的字符集设定,如果建库时没有指明, 将使用服务器安装时指定的字符集设置。 character_set_system: 数据库系统使用的字符集设定。 在创建一个表的时候,每个字段只要不是 binary,都会有一个字符集。如果不指定,那么在 SHOW CREATE TABLE 的时候,它是不会显示出来的,每个表的每个字段都可以指定字符集。 建表时候,字段字符集的选取方式如下: * if 字段指定的字符集 * else if 表指定的字符集 * else if @@character_set_database * else @@character_set_server (如果没有设定,这个值为 latin1) 2、例子: Test 数据库的默认字符集是 latin1,没有指定字符集在 test 上面创建表,默认字符集也是 latin1,可以修改表的某个字段或者表的字符集,修改后字符集发生了变化,具体如下: mysql> show create database test; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+-----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> create table test08(name varchar(20),sex char(2)); 美河学习在线 www.eimhe.com Query OK, 0 rows affected (0.03 sec) mysql> show create table test08\G; *************************** 1. row *************************** Table: test08 Create Table: CREATE TABLE `test08` ( `name` varchar(20) DEFAULT NULL, `sex` char(2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ERROR: No query specified mysql> alter table test08 modify name varchar(20) character set utf8; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table test08\G; *************************** 1. row *************************** Table: test08 Create Table: CREATE TABLE `test08` ( `name` varchar(20) CHARACTER SET utf8 DEFAULT NULL, `sex` char(2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ERROR: No query specified 3、修改数据库默认字符集 mysql> show create database test; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+-----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> alter database test character set utf8; Query OK, 1 row affected (0.00 sec) mysql> show create database test; +----------+---------------------------------------------------------------+ 美河学习在线 www.eimhe.com | Database | Create Database | +----------+---------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec) 3、字符集乱码问题解决 MySQL 会出现中文乱码的原因不外乎下列几点: 1.server 本身设定问题,例如还停留在 latin1 2.table 的语系设定问题(包含 character 与 collation) 3.客户端程式(例如 php)的连线语系设定问题 强烈建议使用 utf8!!!! utf8 可以兼容世界上所有字符!!!! 1、Linux 下 Mysql 中文乱码解决 mysql -uroot -p 回车输入密码 进入 mysql 查看状态如下: mysql 不能插入中文 默认的是客户端和服务器都用了 latin1,所以会乱码。 解决方案: mysql>user mydb; 美河学习在线 www.eimhe.com mysql>alter database mydb character set utf8;! 另一种方法是直接修改默认的 Mysql 配置文件 在 debian 环境下,彻底解决 mysql 无法插入中文和中文乱码的办法 上面提到了用临时方法更改数据库的字符集设置,显示中文,但是后来发现在有的系统下并 不能成功,比如我用的 debian 7.0,找了好久终于找到一个适合 debian 系统的解决方案, debian 7.0 下测试成功,其他诸如修改 client 和 mysql 加入 default-character-set=utf8 的方法 之类的,只适用与 5.5 以前的系统! 终极决绝方案,一劳永逸: debian 下 mysql 的字符串修改为 utf8(参考:rainysia 的专栏) 一、进入 mysql(mysql -uroot -p),查看当前数据库字符集(status;) 二、查看当前系统版本(lsb_release -a) Mysql 不能插入中文 三、#vim /etc/mysql/my.cnf 。(5.5 以前系统)在【client】下面加入 default- character-set=utf8 在【mysqld】下面加入 default-character-set=utf8 Notice : 注 意 如果修改后不能启动报错试试把 default-character-set=utf8 改为 character_set_server=utf8,仅仅加入到 mysqld 下面的.client 就不需要加了 四、#vim /etc/mysql/my.cnf 。(5.5 以后系统)如下修改: [client] default-character-set=utf8 [mysqld] default-storage-engine=INNODB character-set-server=utf8 collation-server=utf8_general_ci 五、重启 mysql(/etc/init.d/mysql stop /etc/init.d/mysql start) 六、修成成功,进入 mysql 查看字符集(mysql>show variables like ‘character_set_%’;) 美河学习在线 www.eimhe.com Mysql 无法插入中文 一、避免创建数据库及表出现中文乱码和查看编码方法 1、创建数据库的时候:CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; 2、建表的时候 CREATE TABLE `database_user` ( `ID` varchar(40) NOT NULL default '', `UserID` varchar(40) NOT NULL default '', ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 这 3 个设置好了,基本就不会出问题了,即建库和建表时都使用相同的编码格式。 但是如果你已经建了库和表可以通过以下方式进行查询。 1.查看默认的编码格式: mysql> show variables like "%char%"; +--------------------------+---------------+ | Variable_name | Value | +--------------------------+---------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+-------------+ 注:以前 2 个来确定,可以使用 set names utf8,set names gbk 设置默认的编码格式; 美河学习在线 www.eimhe.com 执行 SET NAMES utf8 的效果等同于同时设定如下: SET character_set_client='utf8'; SET character_set_connection='utf8'; SET character_set_results='utf8'; 2.查看 test 数据库的编码格式: mysql> show create database test; +------------+----------------------------------------------------------------- -------------------------------+ | Database | Create Database | +------------+----------------------------------------------------------------- -------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gbk */ | +------------+----------------------------------------------------------------- -------------------------------+ 3.查看 yjdb 数据库的编码格式: mysql> show create table yjdb; | yjdb | CREATE TABLE `yjdb` ( `sn` int(5) NOT NULL AUTO_INCREMENT, `type` varchar(10) NOT NULL, `brc` varchar(6) NOT NULL, `teller` int(6) NOT NULL, `telname` varchar(10) NOT NULL, `date` int(10) NOT NULL, `count` int(6) NOT NULL, `back` int(10) NOT NULL, PRIMARY KEY (`sn`), UNIQUE KEY `sn` (`sn`), UNIQUE KEY `sn_2` (`sn`) ) ENGINE=MyISAM AUTO_INCREMENT=1826 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC | 二、避免导入数据有中文乱码的问题 1:将数据编码格式保存为 utf-8 设置默认编码为 utf8: 美河学习在线 www.eimhe.com set names utf8; 设置数据库 db_name 默认为 utf8: ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 设置表 tb_name 默认编码为 utf8: ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 导入: LOAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb; 2:将数据编码格式保存为 ansi(即 GBK 或 GB2312) 设置默认编码为 gbk: set names gbk; 设置数据库 db_name 默认编码为 gbk: ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 设置表 tb_name 默认编码为 gbk: ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 导入: LOAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb; 注:1.UTF8 不要导入 gbk,gbk 不要导入 UTF8; 2.dos 下不支持 UTF8 的显示; 三、解决网页中乱码的问题 将网站编码设为 utf-8,这样可以兼容世界上所有字符。 如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页 面的编码设为 GBK, GBK 与 GB2312 的区别就在于:GBK 能比 GB2312 显示更多的字符,要显示 简体码的繁体字,就只能用 GBK。 1.编辑/etc/my.cnf ,在[mysql]段加入 default_character_set=utf8; 2.在编写 Connection URL 时,加上?useUnicode=true&characterEncoding=utf-8 参; 3.在网页代码中加上一个"set names utf8"或者"set names gbk"的指令,告诉 MySQL 连线 内容都要使用 utf8 或者 gbk; 4、字符集比较 utf8/GBK MySQL 中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的。 character-set-database:数据库字符集。 character-set-table:数据库表字符集。 美河学习在线 www.eimhe.com 优先级依次增加。所以一般情况下只需要设置 character-set-server,而在创建数据库和表时 不特别指定字符集,这样统一采用 character-set-server 字符集。 character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时, 请求以该字符集进行编码。 character-set-results:结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集 进行编码。 在客户端,如果没有定义 character-set-results,则采用 character-set-client 字符集作为默认的 字符集。所以只需要设置 character-set-client 字符集。 要处理中文,则可以将 character-set-server 和 character-set-client 均设置为 GB2312,如果要 同时处理多国语言,则设置为 UTF8。 关于 MySQL 的中文问题 解决乱码的方法是,在执行 SQL 语句之前,将 MySQL 以下三个系统参数设置为与服务器字 符集 character-set-server 相同的字符集。 character_set_client:客户端的字符集。 character_set_results:结果字符集。 character_set_connection:连接字符集。 设置这三个系统参数通过向 MySQL 发送语句:set names gb2312 关于 GBK、GB2312、UTF8 UTF-8:Unicode Transformation Format-8bit,允许含 BOM,但通常不含 BOM。是用以解决国 际上字符的一种多字节编码,它对英文使用 8 位(即一个字节),中文使用 24 为(三个字 节)来编码。UTF-8 包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8 编 码的文字可以在各国支持 UTF8 字符集的浏览器上显示。如,如果是 UTF8 编码,则在外国 人的英文 IE 上也能显示中文,他们无需下载 IE 的中文语言支持包。 GBK 是国家标准 GB2312 基础上扩容后兼容 GB2312 的标准。GBK 的文字编码是用双字节来 表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成 1。 GBK 包含全部中文字符,是国家编码,通用性比 UTF8 差,不过 UTF8 占用的数据库比 GBD 大。 GBK、GB2312 等与 UTF8 之间都必须通过 Unicode 编码才能相互转换: GBK、GB2312--Unicode--UTF8 UTF8--Unicode--GBK、GB2312 对于一个网站、论坛来说,如果英文字符较多,则建议使用 UTF-8 节省空间。不过现在很 多论坛的插件一般只支持 GBK。 GB2312 是 GBK 的子集,GBK 是 GB18030 的子集 GBK 是包括中日韩字符的大字符集合 如果是中文的网站 推荐 GB2312 GBK 有时还是有点问题 为了避免所有乱码问题,应该采用 UTF-8,将来要支持国际化也非常方便 UTF-8 可以看作是大字符集,它包含了大部分文字的编码。 使用 UTF-8 的一个好处是其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观 看你的文字而不会出现乱码。 美河学习在线 www.eimhe.com gb2312 是简体中文的码 gbk 支持简体中文及繁体中文 big5 支持繁体中文 utf-8 支持几乎所有字符 首先分析乱码的情况 1.写入数据库时作为乱码写入 2.查询结果以乱码返回 究竟在发生乱码时是哪一种情况呢? 我们先在 mysql 命令行下输入 show variables like '%char%'; 查看 mysql 字符集设置情况: mysql> show variables like '%char%'; +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | gbk | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | gbk | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | +--------------------------+----------------------------------------+ 在查询结果中可以看到 mysql 数据库系统中客户端、数据库连接、数据库、文件系统、查询 结果、服务器、系统的字符集设置 在这里,文件系统字符集是固定的,系统、服务器的字符集在安装时确定,与乱码问题无关 乱码的问题与客户端、数据库连接、数据库、查询结果的字符集设置有关 *注:客户端是看访问 mysql 数据库的方式,通过命令行访问,命令行窗口就是客户端,通 过 JDBC 等连接访问,程序就是客户端 我们在向 mysql 写入中文数据时,在客户端、数据库连接、写入数据库时分别要进行编码转 换 在执行查询时,在返回结果、数据库连接、客户端分别进行编码转换 现在我们应该清楚,乱码发生在数据库、客户端、查询结果以及数据库连接这其中一个或多 个环节 接下来我们来解决这个问题 在登录数据库时,我们用 mysql --default-character-set=字符集-u root -p 进行连接,这时我们 再用 show variables like '%char%';命令查看字符集设置情况,可以发现客户端、数据库连接、 查询结果的字符集已经设置成登录时选择的字符集了 如果是已经登录了,可以使用 set names 字符集;命令来实现上述效果,等同于下面的命令: 美河学习在线 www.eimhe.com set character_set_client = 字符集 set character_set_connection = 字符集 set character_set_results = 字符集 如果是通过 JDBC 连接数据库,可以这样写 URL: URL=jdbc:mysql://localhost:3306/abs?useUnicode=true&characterEncoding=字符集 JSP 页面等终端也要设置相应的字符集 数据库的字符集可以修改 mysql 的启动配置来指定字符集,也可以在 create database 时加 上 default character set 字符集来强制设置 database 的字符集 通过这样的设置,整个数据写入读出流程中都统一了字符集,就不会出现乱码了 为什么从命令行直接写入中文不设置也不会出现乱码? 可以明确的是从命令行下,客户端、数据库连接、查询结果的字符集设置没有变化 输入的中文经过一系列转码又转回初始的字符集,我们查看到的当然不是乱码 但这并不代表中文在数据库里被正确作为中文字符存储 举例来说,现在有一个 utf8 编码数据库,客户端连接使用 GBK 编码,connection 使用默认 的 ISO8859-1(也就是 mysql 中的 latin1),我们在客户端发送“中文”这个字符串,客户端 将发送一串 GBK 格式的二进制码给 connection 层,connection 层以 ISO8859-1 格式将这段 二进制码发送给数据库,数据库将这段编码以 utf8 格式存储下来,我们将这个字段以 utf8 格式读取出来,肯定是得到乱码,也就是说中文数据在写入数据库时是以乱码形式存储的, 在同一个客户端进行查询操作时,做了一套和写入时相反的操作,错误的 utf8 格式二进制 码又被转换成正确的 GBK 码并正确显示出来。 13、Mycat http://blog.sina.com.cn/s/blog_6e322ce70100zs9a.html http://blog.csdn.net/shagoo/article/details/8191346 http://blog.csdn.net/bluishglc/article/details/7696085 http://my.oschina.net/ydsakyclguozi/blog/199498 mycat linux: http://www.doc88.com/p-0784652744615.html http://blog.csdn.net/dreamcode/article/details/44307377 http://www.blogjava.net/amigoxie/archive/2014/12/24/421788.html http://www.blogjava.net/amigoxie/archive/2015/01/07/421858.html https://github.com/MyCATApache/Mycat-doc mycat 读写分离: http://www.tuicool.com/articles/va2AFj 分表: http://www.2cto.com/database/201503/385641.html 美河学习在线 www.eimhe.com 1、Mycat 安装 是用 Java 开发,需要有 JAVA 运行环境,若本机没有,则需要下载安装: http://www.java.com/zh_CN/ 获取 MyCAT 的最新开源版本,项目主页 http://code.google.com/p/MyCAT/ 目前最新代码暂时在淘宝上托管,二进制包下载地址: http://code.taobao.org/svn/openclouddb/downloads/ windows 下可以下载 Mycat-server-xxxx.ZIP,linux 下可以下载 tar.gz 解开在某个目录下,注 意,目录不能有空格,在 Linux(Unix)下,建议放在/usr/local/MyCAT 目录下,如下面类似的: [root@devdbserver local]# passwd mycat 更改用户 mycat 的密码 。 新的 密码: 无效的密码: 过短 无效的密码: 过于简单 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新 密码:mycat 启动前,一般需要修改 JVM 配置参数,打开 conf/wrapper.conf 文件,如下行的内容为 2G 和 2048,可根据本机配置情况修改为 512M 或其它值。 wrapper.java.additional.5=-XX:MaxDirectMemorySize=512M wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false # Initial Java Heap Size (in MB) #wrapper.java.initmemory=3 wrapper.java.initmemory=512 # Maximum Java Heap Size (in MB) #wrapper.java.maxmemory=64 wrapper.java.maxmemory=512 美河学习在线 www.eimhe.com 然后启动 mycat,进入 bin 目录下面,首先要 chmod +x mycat,授予可执行权限,然后执行 mycat console 启动。 [root@devdbserver bin]# ./mycat console Running Mycat-server... wrapper | --> Wrapper Started as Console wrapper | Launching a JVM... jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. jvm 1 | jvm 1 | log4j 2015-07-31 12:59:19 [./conf/log4j.xml] load completed. jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log 注:mycat 支持的命令{ console | start | stop | restart | status | dump } 1、解压安装 [root@devdbserver local]# ls bin etc include lib64 man Mycat-Server-1.4-RC-Linux-RW-20150724.tar.gz mysql- 5.6.20.tar.gz share doc games lib libexec mha mysql sbin src [root@devdbserver local]# tar -zxvf Mycat-Server-1.4-RC-Linux-RW-20150724.tar.gz [root@devdbserver local]# ls bin etc include lib64 man mycat mysql sbin src doc games lib libexec mha Mycat-Server-1.4-RC-Linux-RW-20150724.tar.gz mysql-5.6.20.tar.gz share [root@devdbserver local]# cd mycat/ [root@devdbserver mycat]# ls bin catlet conf lib logs version.txt [root@devdbserver mycat]# pwd /usr/local/mycat 2、创建用户 mycat [root@devdbserver mycat]# useradd mycat [root@devdbserver mycat]# chown -R mycat.mycat /usr/local/mycat [root@devdbserver local]# passwd mycat 更改用户 mycat 的密码 。 新的 密码: 无效的密码: 过短 无效的密码: 过于简单 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新 密码:mycat 美河学习在线 www.eimhe.com 3、调整内存使用 根据实际情况调整内存使用。 [root@devdbserver conf]# pwd /usr/local/mycat/conf [root@devdbserver conf]# vi wrapper.conf # Java Additional Parameters #wrapper.java.additional.1= wrapper.java.additional.1=-DMYCAT_HOME=. wrapper.java.additional.2=-server wrapper.java.additional.3=-XX:MaxPermSize=64M wrapper.java.additional.4=-XX:+AggressiveOpts wrapper.java.additional.5=-XX:MaxDirectMemorySize=512M wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false # Initial Java Heap Size (in MB) #wrapper.java.initmemory=3 wrapper.java.initmemory=512 # Maximum Java Heap Size (in MB) #wrapper.java.maxmemory=64 wrapper.java.maxmemory=512 4、启动 mycat [root@devdbserver bin]# chmod +x mycat [root@devdbserver bin]# ll 总用量 376 -rwxrwxrwx 1 mycat mycat 15714 7 月 13 19:01 mycat -rwxrwxrwx 1 mycat mycat 2947 6 月 17 10:01 rehash.sh -rwxrwxrwx 1 mycat mycat 2502 6 月 17 10:01 startup_nowrap.sh -rwxrwxrwx 1 mycat mycat 140198 7 月 13 19:01 wrapper-linux-ppc-64 -rwxrwxrwx 1 mycat mycat 99401 7 月 13 19:01 wrapper-linux-x86-32 -rwxrwxrwx 1 mycat mycat 111027 7 月 13 19:01 wrapper-linux-x86-64 [root@devdbserver bin]# ./mycat console Running Mycat-server... wrapper | --> Wrapper Started as Console wrapper | Launching a JVM... jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. 美河学习在线 www.eimhe.com jvm 1 | jvm 1 | log4j 2015-07-31 12:59:19 [./conf/log4j.xml] load completed. jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log [root@devdbserver bin]# ./mycat status Mycat-server is running (4799). 2、单机分库部署 07/31 14:26:09.582 INFO [WrapperSimpleAppMain] (MycatServer.java:266) -using nio network handler 07/31 14:26:09.614 INFO [WrapperSimpleAppMain] (MycatServer.java:284) -$_MyCatManager is started and listening on 9066 07/31 14:26:09.615 INFO [WrapperSimpleAppMain] (MycatServer.java:288) -$_MyCatServer is started and listening on 8066 07/31 14:26:09.616 INFO [WrapperSimpleAppMain] (MycatServer.java:290) - =============================================== 07/31 14:26:09.616 INFO [WrapperSimpleAppMain] (MycatServer.java:293) -Initialize dataHost ... 14、mysql 管理工具 navicat premium/dbForge studio for mysql/mysql workbench MyDB Studio 1、navicat premium 美河学习在线 www.eimhe.com 2、dbForge studio for mysql 调试存储过程:http://my.oschina.net/u/582827/blog/226839 3、mysql workbench
还剩215页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

gonghl

贡献于2017-01-06

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf