mysql多实例的安装以及主从复制配置
1.mysql多实例的安装 1)配置文件 # cat /etc/my.cnf.multi [mysqld_multi] mysqld=/usr/bin/mysqld_safe //mysqld的路径 mysqladmin=/usr/bin/mysqladmin //mysqladmin的路径 user=root //使用用户 [mysqld1] //1表示标识第一个数据库实例,如下5项为多实例下必须标识的变量 port=3306 socket=/var/lib/mysql/mysql.sock datadir=/var/lib/mysql pid-file=/var/lib/mysql/mysql.pid user=mysql [mysqld2] port=3307 socket=/var/lib/mysql3307/mysql3307.sock datadir=/var/lib/mysql3307 pid-file=/var/lib/mysql3307/mysql3307.pid user=mysql 2)配置过程 a.建立datadir=/var/lib/mysql3307 mkdir -p /var/lib/mysql3307 chown mysql:mysql /var/lib/mysql3307 b.初始化3307数据库文件 mysql_install_db –datadir=/var/lib/mysql3307 –user=mysql c.多实例的启动 通过命令mysqld_multi –config-file=/etc/my.cnf.multi report可以查看多实例的运行状态,结果如下: MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 not running 说明实例1正在运行中,实例2没有运行,此时可以通过: mysqld_multi –config-file=/etc/my.cnf.multi start 2的方式启动实例2,并通过report参数进行查询。 关闭实例的命令为: mysqld_multi –config-file=/etc/my.cnf.multi stop 2 如果在start和stop的后面不添加实例号码的话,将是对所有实例的操作!要小心! —————————————————————————————————————————— 2.mysql主从复制配置 1)主从复制原理 Mysql的 Replication是一个异步的复制过程,从Master复制到Slave。在Master和Slave实现整个复制过程由三个线程来完成,其中两个 线程(Sql线程和IO线程)在Slave端,另外一个线程(IO线程)在 Master端。要实现复制过程,Master必须打开Binary Log功能,复制过程就是Slave从Master端获取mysql-bin.xxxxxx日志然后在自己身上完全顺序的执行日志中所记录的各种操作。 2)主从复制过程 a.Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; b.Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指 定位置之后的日志信息,返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master端的Binary Log文件的名称以及在BinaryLog中的位置; c.Slave的IO线程接受到信息后,将接收到的日志内容依次写入到Slave端的Relay Log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中(下一次Slave请求时用)。 d.Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文件中的内容成为在 Master端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。 - 3)主从复制配置实例 a.master机器:192.168.100.19 3306,slave机器:192.168.100.22 3306 b.分别在master上和slave上创建一个用于复制的数据库repl: create database repl; c.在master的配置文件/etc/my.cnf.multi中的[mysqld1]增加如下配置: server-id=1 //master的id,通常为1 log-bin=mysql-bin //打开Binary Log功能 binlog-do-db=repl //需要同步的数据库,如果没有这个参数,表示通报所有数据库 d.在master机上为slave机添加一同步帐号 mysql> grant replication slave on *.* to identified by ‘repl’; - e.在slave的配置文件/etc/my.cnf.multi中的[mysqld1]增加如下配置: server-id=2 //slave id master-host=192.168.100.19 //master ip master-user=repl //连接master的账号 master-password=repl //连接master的密码 master-port=3306 //master port master-connect-retry=60 replicate-do-db=repl //需要同步的 - f.重启masterd_multi –config-file=/etc/my.cnf.multi stop 1 mysqld_multi –config-file=/etc/my.cnf.multi start 1 用show master status 命令查看如下: mysql> show master status; +————+———-+————–+——————+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +————+———-+————–+——————+ | log.000002 | 626 | repl | | +————+———-+————–+——————+ g.重启slave mysqld_multi –config-file=/etc/my.cnf.multi stop 1 mysqld_multi –config-file=/etc/my.cnf.multi start 1 用show slave status查看如下:(如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.100.19 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: log.000002 Read_Master_Log_Pos: 626 Relay_Log_File: mysql-relay-bin.000004 Relay_Log_Pos: 229 Relay_Master_Log_File: log.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: repl 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: 626 Relay_Log_Space: 229 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 1 row in set (0.00 sec) - h.测试 在master建一个表并插入数据: mysql> CREATE TABLE `vendors` ( -> `vend_id` int(11) NOT NULL auto_increment, -> `vend_name` char(50) NOT NULL, -> `vend_address` char(50) default NULL, -> `vend_city` char(50) default NULL, -> `vend_state` char(5) default NULL, -> `vend_zip` char(10) default NULL, -> `vend_country` char(50) default NULL, -> PRIMARY KEY (`vend_id`) -> ); mysql> insert into vendors values(’1′,’zou’,'tianhe’,'guangzhou’,'cn’,’5100′,’zhongguo’); 在slave查看是否有数据: mysql> select * from vendors; +———+———–+————–+———–+————+———-+————–+ | vend_id | vend_name | vend_address | vend_city | vend_state | vend_zip | vend_country | +———+———–+————–+———–+————+———-+————–+ | 1 | zou | tianhe | guangzhou | cn | 5100 | zhongguo | +———+———–+————–+———–+————+———-+————–+ —————————————————————————————————————————— 3.mysql配置其他常见的参数说明 skip-locking //避免mysql外部锁定,减少出错几率,增强稳定性 skip-name-resolve //取消DNS的反向解析 back_log = 64 //指定MySQL可能的连接数量,该参数指出参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 key_buffer_size = 256M //用于索引块的缓冲区大小,增加它可得到更好处理的索引 max_allowed_packet = 8M //一个查询语句包的最大尺寸。 table_cache = 256K //所有线程打开表的数量 sort_buffer_size = 6M net_buffer_length = 256K 通信缓冲区在查询期间被重置到该大小 read_buffer_size = 4M //读查询操作所能使用的缓冲区大小,如果有100个链接,则实际分配缓冲区为100*4=400M read_rnd_buffer_size = 2M join_buffer_size = 8M //用于全部联合(join)的缓冲区大小(不是用索引的联结)。缓冲区对2个表间的每个全部联结分配一次缓冲区,当增加索引不可能时,增加该值可得到一个更快的全部联结。(通常得到快速联结的最佳方法是增加索引。) myisam_sort_buffer_size = 64M query_cache_size = 8M max_connections=2000 //允许同时连接MySQL服务器的客户数量。如果超出该值,MySQL会返回Too many connections错误 max_connect_errors=99999 //如果有多于该数量的中断连接,将阻止进一步的连接;如需对该主机进行解禁,执行:FLUSH HOST; thread_cache_size=128 thread_concurrency = 8 log_slow_queries = slow_queries.log //开启慢查询日志 long_query_time = 1 //如果一个查询所用时间大于此时间,slow_queried计数将增加 default-character-set=utf8 lower_case_table_names=1 //MySQL总使用小写字母进行SQL操作 innodb_buffer_pool_size = 3000M //InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小,适当的增加这个参数的大小,可以有效的减少InnoDB类型的表的磁盘I/O 。在一个以 InnoDB 为主的专用数据库服务器上,可以考虑把该参数设置为物理内存大小的 60%-80% 。 innodb_additional_mem_pool_size = 50M //这个参数用来设置InnoDB存储的数据目录信息和其它内部数据结构的内存池大小。如果 InnoDB 用光了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息。 expire_logs_days = 30 //Binary Log自动删除的天数