MySql 双主互备复制配置

2 年前写过一篇《MySql 主从复制配置》,好久没接触 MySql 相关的东西了,最近刚好有个配置两台数据库做互备的需求,做一个双主互备主要为了一个是做一个数据备份,其次两台机子都可以读写操作,也可以 mysql 做负载均衡吧。配置过程相对还是蛮简单的,差不多就是主从配置再逆操作一下的感觉。 假设两台 MySql 的 IP 分别为: 假设两台 MySql 的 IP 分别为: MySql-Master 192.168.0.1 假设两台 MySql 的 IP 分别为: MySql-Master 192.168.0.1 MySql-Slave 192.168.0.2 1.配置 MySql-Master ~# vi /etc/mysql/my.cn server-id = 238 #唯一id,一般用ip的最后一段 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M binlog_ignore_db = mysql #设置不用同步的表 binlog_ignore_db = information_schema binlog_ignore_db = performance_schema auto-increment-increment = 2 #因为我们有两台机子,这里插入数据的自增长设为2 auto-increment-offset = 1 #这个库中每插入一条自增长的偏移量为1 2.重启一下 mysql ~# service mysql restart 3.

阅读全文

今天突然发现我的博客不能访问了,显示 Wordpress 的”数据库连接错误的”的报错信息,立马登陆到 VPS 上查看 MySql 的进程,进程存在,又 top 了一下,MySql 并没有资源占用异常。好吧,重启 MySql,Shutdown 很久,实在没法忍了我就直接 Kill 了它的进程。 再重启 Mysql 时发现报错: 查看 MySql 的 data 目录权限,并 chown mysql:mysql,重启无效 ps 一下确实已经没有 mysql 进程在运行 查看 localhost.err: key_buffer_size=16777216 read_buffer_size=262144 max_used_connections=0 max_threads=2000 thread_count=0 connection_count=0 It is possible that mysqld could use up to key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 1575430 K bytes of memory Hope that’s ok; if not, decrease some variables in the equation. Thread pointer: 0x0 Attempting backtrace.

阅读全文

在 MySql 5.1 的版本以后支持定时任务 Event Scheduler,有点类似于 Linux 的 contab,可以创建 Event 来定时执行 MySql 的语句,具体的文档详见 MySql 的官方文档http://dev.mysql.com/doc/refman/5.1/en/events-privileges.html。 1.开启 全局变量 event_scheduler 用来设定是否服务器端运行执行计划任务,该变量有如下三种值: OFF:计划任务处于停止状态,event scheduler 线程没有运行。是 event_scheduler 的默认值(执行一下任意一条命令关闭); SET GLOBAL event_scheduler = OFF; SET @@global.event_scheduler = OFF; SET GLOBAL event_scheduler = 0; SET @@global.event_scheduler = 0; ON:计划任务处于运行状态,event scheduler 线程启动,并执行所有的计划任务(执行一下任意一条命令开启); SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1; DISABLED:该值将致使计划任务不可运行 运行 MySql 服务时候加上参数 --event-scheduler=DISABLED 或者在 my.

阅读全文

MySql 主从复制配置

记录一下配置 MySql 的主从的过程。 修改 mast 服务器的 mysql 的配置 vim /etc/my.cnf [mysqld] log-bin=binary-log server-id = 1 log-bin 启用 mysql 的二进制日志,它为 mysql 复制提供 DDL 和 DML 的语句流,这里可以是文件名前缀和目录,默认日志文件存放在数据目录中(mysql/var/)中,然后重新启动 mysql 守护进程 mysql> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | binary-log.000001 | 106 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 然后为从服务器添加一个用户 CREATE USER yuansir@'192.168.%' IDENTIFIED BY 'yuansir'; GRANT REPLICATION SLAVE ON *.* TO yuansir@'192.

阅读全文

最近项目中遇到从论坛随机取出帖子放在首页,其实就是从数据库中随机取出一条记录,很明显,用 order by rand() 肯定不行,效率低的不行,我尝试了下在使用 order by rand()的时候,表中有 25 万条记录,随机读取一条的执行时间大约是 0.55 秒左右。总结一下优化这条 SQL 语句的效率的几种方法。 第一种方法: 结合应用层来实现 只要 SELECT MAX(id) FROM table;取出最大的 id,然后用随机生成一个 1~MAX(id)数,比如 PHP mt_rand(1, MAX(id)) 然后再在用这个随机 id 去查询那条记录。 第二种方法: 利用数据库生成的随机的 id,子查询的方式 SELECT CEIL(RAND() * (SELECT MAX(id) FROM table)); 这样我们就可以获取一个随机的 id.(对 MAX()进行优化,不使用SELECT CEIL(RAND() * MAX(id)) FROM table),执行一下,大大优化了 SELECT * FROM table WHERE id >= ( SELECT CEIL( RAND( ) * ( SELECT MAX( id ) FROM table ) ) ) LIMIT 1 第三种方法: 利用 JOIN 的方法

阅读全文

MySql全文索引的总结

语法上来说,建立全文索引和建立其他的索引差不多: CREATE FULLTEXT INDEX title ON column (title) ALTER TABLE table_name ADD FULLTEXT (column) 使用全文索引语法: MATCH(col1,col2,…) AGAINST(expr [search_modifier]) search_modifier为搜索修饰符, IN BOOLEAN MODE(布尔模式):使用具自己语法的搜索字符串包括搜索条件进行搜索。 IN NATURAL LANGUAGE MODE(自然语言模式):搜索字符串不包括特殊语法,不会匹配超过 50%的行中都存在的单词。 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION(带查询扩展的自然语言模式):和 IN NATURAL LANGUAGE MODE 差不多,在结果返回前会将初始条件搜索的结果加入到初始搜索条件中再次搜索。 MySql 全文索引的一些局限性: 有单词的最短长度的限制, SHOW VARIABLES LIKE ‘ft_min_word_len’ 看一下,结果为 4. 只能使用 MyISAM 的存储引擎。 全文检索是可更新的索引,在表中添,删,改的时候,每次索引都要进行修改,这样会导致表查询性能降低。 对于非英文单词,比如中文这种没有单词分隔符的就无法确定单词的开始和结束 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: MySql 全文索引的总结 本作品采用知识共享署名-非商业性使用 4.

阅读全文

MySql GROUP_CONCAT() 使用

GROUP_CONCAT()是 MySQL 数据库提供的一个函数,通常跟 GROUP BY 一起用,具体可参考 MySQL 官方文挡:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat。 GROUP_CONCAT()是 MySQL 数据库提供的一个函数,通常跟 GROUP BY 一起用,具体可参考 MySQL 官方文挡:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat。 语法: GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val]) 1.例如: SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id; +————+———+ student_id courses +————+———+ | 2 | 3,4,5 | +————+———+ 这 就不需要用 php 循环了 $row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id"); $result = explode(',', $row['courses']); 2.

阅读全文

MySQL优化相关查询指令

查看 MySQL 服务器配置信息 mysql> show variables; 查看 MySQL 服务器运行的各种状态值 mysql> show global status; 慢查询 mysql> show variables like ‘%slow%’; mysql> show global status like ‘%slow%’; 分析慢查询日志,找出有问题的 SQL 语句,慢查询时间不宜设置过长,否则意义不大,最好在 5 秒以内,如果你需要微秒级别的慢查询,可以考虑给 MySQL 打补丁:http://www.percona.com/docs/wiki/release:start,记得找对应的版本。 连接数 经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL 服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是 MySQL 配置文件中 max_connections 值过小: mysql> show variables like ‘max_connections’; mysql> show global status like ‘max_used_connections’; 最大连接数占上限连接数的 85%左右,如果发现比例在 10%以下,MySQL 服务器连接数上限设置的过高了。 key_buffer_size key_buffer_size 是对 MyISAM 表性能影响最大的一个参数, 不过数据库中多为 Innodb

阅读全文

备份 MySQL 数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份 MySQL 数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。 mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql 直接将 MySQL 数据库压缩备份 mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz 备份 MySQL 数据库某个(些)表 mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql 同时备份多个 MySQL 数据库 mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql 仅仅备份数据库结构 mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.

阅读全文

由于应用服务器和数据库服务器是独立的,发现链接到 MySQL 数据库的时候 PHP 处理数据时页面执行的很慢,如果应用和数据库在同一个服务器上时,则速度很正常,很快,这是为什么呢? 查了下资料发现,默认安装的 MYSQL 开启了 DNS 的反向解析,MySQL 官方文档中关于 MySQL 如何使用 DNS 的说明: 当一个新的客户端连接到 mysqld 时,mysqld 会产生一个新的线程来处理这个请求。这个线程首先会检查主机名是否在缓存中存在,如果不存在,它将尝试解析这个主机名。 如果操作系统支持线程安全的 gethostbyaddr_r() 和 gethostbyname_r() 调用,这个线程会使用它们执行主机名解析。 如果操作系统不支持线程安全的调用,这个线程就会锁定一个互斥体并换为调用 gethostbyaddr() 和 gethostbyname() 。在这种情况下,第一个线程解锁互斥体之前,其他的线程将不能解析在缓存中不存在的主机名。 你可以通过添加–skip-name-resolve 参数启动 mysqld 来禁用 DNS 主机名查询。但是这将导致你在 MySQL 的授权表中只能使用 IP 数字。 如果你使用一个很慢的 DNS 和许多主机,你可以通过添加–skip-name-resolve 禁用域名查询或通过增加 HOST_CACHE_SIZE 定义的值(默认值: 128)并重新编译 mysqld 来提升性能。 你可以通过–skip-host-cache 参数禁用主机名缓存。要清空主机名缓存,可以执行一个 FLUSH HOSTS 语句或执行 mysqladmin 中的 flush-hosts 命令实现。 要完全禁用 ICP/IP 连接,请添加 –skip-networking 启动 mysqld。 好了,这样就知道原因了,解决方法(UNIX 或 LINUX 系统下)my.cnf 里面添加 [mysqld] skip-name-resolve skip-grant-tables 禁用 DNS 解析,这样连接速度正常的快很多了。

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京