`

mysql去采用触发器来实现数据自动同步到memcached

阅读更多

编译安装

首先确定你安装的mysql是5.1以上的版本,同时需要安装 mysql-devel
安装memcached

首先得安装libevent,这个就不介绍了。

首先下载memcached-1.4.5-2.el5.remi.x86_64.rpm和memcached-devel-1.4.5-2.el5.remi.x86_64.rpm(这个安装libmemcached要用到)

安装执行

rpm -Uvh memcached-1.4.5-2.el5.remi.x86_64.rpm
memcached-devel-1.4.5-2.el5.remi.x86_64.rpm

如果自己编译记得设置好安装目录,让接下来的依赖它的库的安装都能够找得到。
编译安装libmemcached

这个就比较纠结了,因为要选择好版本,而且可能还要去XX。下载地址:https://launchpad.net/libmemcached/+download

选择版本0.34,不然会报“ servers.c:263:28: error: ‘memcached_st’ has no member named ‘hosts’ ”或者“ ERROR 1126 (HY000) at line 38: Can’t open shared library ‘libmemcached_functions_mysql.so’ (errno: 0 /usr/local/mysql/lib/plugin/libmemcached_functions_mysql.so: undefined symbol: memcached_string_append) ”的错误,后一个错误是在mysql执行sql的时候报的。

解压编译,过程如下

./configure –prefix=/usr/local

make && make install

因为安装路径是在/usr/local下,所以需要修改/etc/ld.so.conf,将/usr/local/lib加入,并且执行/sbin/ldconfig

而且需要设置pkg-confg(如果没有需要安装),不然会在编译memcached_functions_mysql的时候,会报“No package ‘libmemcached’ found”的错误

执行

whereis pkgconfig

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$
PKG_CONFIG_PATH
编译安装 memcached_functions_mysql

这个同样要选择好合适的版本,我这里选择了1.0版本,刚刚开始我用了1.1版本,编译就会了一些问题。这个版本在官方有下的,其他版本可能有问题哦。

编译过程如下

./configure –prefix=/usr/local
–with-mysql=/usr/bin/mysql_config

make && make install

接下来将/usr/local/lib/libmemcached_functions_mysql*的系列文件拷贝到/usr/lib64/mysql/plugin下,直接cp过去,可能会丢掉软连接关系,需要再到 /usr/lib64/mysql/plugin 目录下建立好软连接关系。

最后进入 memcached_functions_mysql的源码目录,先进入mysql终端“mysql -u root -p”

然后执行“source sql/install_functions.sql ;”

成功后查询表mysql.func,可以看到很多 memc为前缀的函数。
启动配置 memcached启动

启动命令和参数如下

memcached -d -m 256 -p 11211

-p 指定端口号(默认11211)

-U UDP监听端口 (默认: 11211, 0 时关闭)

-s 用于监听的UNIX套接字路径(禁用网络支持)

-a UNIX套接字访问掩码,八进制数字(默认:0700)

-m 指定最大使用内存大小(默认64MB)

-t 线程数(默认4)

-l 绑定地址
(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-u 绑定使用指定用于运行进程
(只有root用户可以使用这个参数)

-P 将PID写入文件,这样可以使得后边进行快速进程终止, 需要与 -d
一起使用

-m 最大内存使用,单位MB。默认64MB

-M 内存耗尽时返回错误,而不是删除项

-c 最大同时连接数,默认是1024

-f 块大小增长因子,默认是1.25

-n 最小分配空间,key+value+flags默认是48

-k锁定所有内存页。注意你可以锁定的内存上限。
mysql配置

mysql去自动同步memcached,主要是采用触发器来实现的。

首先在每次mysql启动后要进行配置(以下都是在mysql终端里执行)。

select memc_servers_set(’127.0.0.1:11211′);

select
memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_NO_BLOCK’,’1′);

select
memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_TCP_NODELAY’,’1′);

设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout才可以插入到表中。

开始创建一个例子

use test;

create table xxd (id int, value varchar(100));

create trigger xxdmmci after insert on xxd for each row set @tmp
= memc_set(NEW.id, NEW.value);

create trigger xxdmmcu after update on xxd for each row set @tmp
= memc_set(NEW.id, NEW.value);

create trigger xxdmmcd before delete on xxd for each row set
@tmp = memc_delete(OLD.id);

至此,全部配置ok了。

然后可以用telnet连接上memcached去看下,执行“get xx”看是否生效。

这就完了吗,可能没有哦。

当你按照这样去操作时,你可能会发现,其实根本没有写入到memcached中。

怎么办呢,网上也没有响应的解决方法,笔者通过写简单的socket通讯测试,发现在mysql UDF中写socket会连接时会报“Permission denied”。所以你根本连接不上任何的服务器,当然memcached也在内。

问题找到了,就好办了,一劳永逸的解决办法

修改/etc/sysconfig/selinux,加入SELINUX=disabled,然后执行“setenforce 0”

当然,出现这样的问题的原因是,你的库是一个用户生成的,而你的mysqld的执行用户是另外一个。如果用root来启动mysql可能就不会有这样的问题了。

分享到:
评论

相关推荐

    用mysql触发器自动更新memcache的实现代码

    本文将详细讲解如何利用MySQL触发器自动更新Memcache中的数据,以及具体的实现步骤。 首先,MySQL触发器是在满足特定条件时自动执行的数据库操作。在MySQL 5.1及以上版本中,引入了触发器功能,允许用户定义在插入...

    MYSQL学习资料

    MySQL5 5 Semi synchronous Replication(半同步复制) mysqlslap MySQL压力测试工具 mysql proxy安装配置 mysql 触发器 mysql与MongoDB语法对比 mysql分表的3种方法 MySQL数据库扩展小记 mysql架构方案 MySQL水平...

    redis做mysql缓存服务器(公司内部培训资料)

    - 设置MySQL触发器,用于在数据发生变更时自动更新Redis缓存。 通过以上步骤,我们成功搭建了一个基于Redis的MySQL缓存服务器环境,实现了读写分离,提高了系统的性能和稳定性。这种方式特别适用于需要频繁读取...

    MySql-Administration

    9. **复制与高可用性**:MySQL支持主从复制,可以将一个服务器的数据实时同步到其他服务器,以实现负载均衡和高可用性。在主服务器故障时,可以快速切换到从服务器,避免服务中断。 总之,"MySql-Administration...

    MySQL的源码安装及使用UDFs进行数据自动更新的教程

    接下来,我们将讨论如何使用UDFs(用户自定义函数)实现Memcached与MySQL之间的数据自动更新。 **UDFs在MySQL中的应用**: UDFs允许用户扩展MySQL的功能,创建自定义的函数来处理特定的数据类型或执行特定的操作。...

    Oracle Database 11g & MySQL 5.6开发手册 PDF清晰版

    还将介绍PL/SQL和MySQL的存储过程、触发器和函数的编写,帮助开发者实现更复杂的业务逻辑。此外,对于数据库设计,将探讨范式理论、实体关系模型以及如何进行数据库规范化,以减少数据冗余和提高数据一致性。 在...

    mysql面试题.zip

    11. **复制与集群**:MySQL复制允许数据从一个服务器(主节点)实时同步到其他服务器(从节点),以提高可用性和扩展性。MySQL集群提供高可用性和负载均衡。 12. **安全性**:用户权限管理(GRANT, REVOKE)、加密...

    某互联网大厂MySQL面试题-20题(附带答案)

    19. **主从复制**:主从复制是MySQL的一种高可用和数据备份方案,主数据库的变更会被同步到从库,实现数据冗余和负载均衡。 这些面试题涵盖了MySQL基础知识的核心部分,对于准备面试或者想要深入理解MySQL的开发者...

    redis 运维之道 good

    - **MySQL + Mytrigger → 多个Redis实例**:这种方式通常用于数据同步场景,即通过触发器将MySQL中的变更数据同步到多个Redis实例中,以实现数据的快速读取和高可用性。 - **MySQL → MytriggerQ → 队列处理器 ...

    java面试题,内容详细,包含mysql,多线程,中间件

    面试题可能涵盖线程的生命周期、同步机制(synchronized关键字,volatile变量,Lock接口及其实现),线程池(ExecutorService,ThreadPoolExecutor和ScheduledThreadPoolExecutor的使用),死锁和活锁的概念,以及...

    Navicat_for_SQLite_9.0.15_20101029

    5. **数据同步**:该版本可能包含了数据同步功能,可以帮助用户比较和同步数据库之间的差异,确保数据库的一致性。 6. **备份与恢复**:Navicat提供了定时备份和恢复功能,可以设置计划任务自动备份数据库,以防...

    大数据面试知识点

    线程的同步通过锁来实现,synchronized和ReentrantLock是两种常用的锁机制。 CAS(CompareAndSet)即比较并交换,是一种用于实现无锁同步的算法。CAS算法通过原子性操作来保证对共享资源的安全访问。 线程池是用于...

    java面试题综合

    50. 多线程实现:继承Thread类、实现Runnable接口,同步方法有synchronized、Lock等。 51. 同步与异步:同步确保数据一致性,异步提高并发性,根据场景选择。 52. 启动线程用start(),run()直接执行线程体。 53. ...

    2023最新Java面试题

    MySQL是常用的数据库系统,面试中会涉及SQL语句的编写、索引优化、事务处理、存储过程、触发器等。对于性能优化,如JOIN操作、子查询优化、存储引擎的比较也是常见的面试问题。 五、SSM(Spring+SpringMVC+MyBatis...

    进大厂面试资料,内容全面

    重点掌握线程的同步机制,如synchronized关键字、volatile变量、Lock接口及其实现,以及并发容器如ConcurrentHashMap和CopyOnWriteArrayList。 【中间件】 中间件是连接不同应用系统的关键技术,常见的Java中间件...

    java学习进阶之路,如果从一个菜鸟进阶成大神(csdn)————程序.pdf

    - **数据库类型**:对比分析MySQL、SQL Server、Oracle等关系型数据库,以及Redis、MongoDB、Memcached等NoSQL数据库的优缺点和应用场景。 - **SQL语句**:熟练编写SQL语句,包括数据库和表的操作、查询、连接、子...

    库存模块

    PHP可以通过事务处理确保数据的一致性,同时使用触发器或定时任务来执行库存盘点和自动预警。 4. 入库与出库:库存模块需要处理采购订单、销售订单等业务流程。PHP可以处理这些订单的创建、审核、确认,同时调整...

Global site tag (gtag.js) - Google Analytics