Is Yang's Blog - mysql
type: channel
link: https://www.isisy.com/tag/mysql/
items: UDF文件十六进制编码
items: Mycat配置数据库的读写分离
items: MySQL主从复制
items: MySQL创建用户、授权等相关操作

UDF文件十六进制编码
type: item
date: 2022-03-19T22:28:00+08:00
description: What is UDF?UDF全称为：user defined function，即用户自定义函数；通过添加新函数，对MySQL的功能进行扩充，性质就像使用本地MySQL函数，例如contact()，user()，version()等。How to use UDFs?在获取到MySQL相关权限后，为通过数据库进行进一步提权操作，我们可以上传UDF文件到MySQL的plugin目录下，然后在MySQL函数表中创建一个函数链接到该UDF文件，这时我们就可以通过这个创建的函数执行一些操作系统的命令以达到提权操作。UDF十六进制编码在写出UDF文件前，我们需要获得UDF文件的十六进制编码，然后再通过MySQL的dumpfile函数在对应系统上进行文件的写出，为方便大家的使用，自己便将Linux与Windows下使用的UDF文件进行编码整理，提供相关的UDF文件的十六进制编码。下方的UDF文件皆取自MSF。MySQLLinux操作系统-64位适用于64位Linux操作系统UDF文件十六进制编码如下：[binary]操作系统-32位适用于32位Linux操作系统UDF文件十六进制编码如下：[binary]操作系统-64位适用于64位Windows操作系统UDF文件十六进制编码如下：[binary]操作系统-32位适用于32位Windows操作系统UDF文件十六进制编码如下：[binary]系统PostgreSQL 8.2 8.3 8.4通用：[binary]文件导入方式可参考该文章：[post cid="1225" /]附：UDF文件十六进制编码获取方法（Linux系统下）：方法一：od -Ax -tx1 -v UDF文件 | awk '{$1="";printf $0}' | xargs | tr -d ' '方法二：xxd -ps UDF文件| tr -d '\n'

Mycat配置数据库的读写分离
type: item
date: 2021-02-15T22:21:00+08:00
description: 简介读写分离，简单地说是把对数据库的读和写操作分开，以对应不同的数据库服务器。主数据库提供写操作，从数据库提供读操作，这样能有效地减轻单台数据库的压力。主数据库进行写操作后，数据及时同步到所读的数据库，尽可能保证读、写数据库的数据一致。此处的读写分离采用的是Mycat。Mycat 的原理中最重要的一个词是“拦截”，它拦截了用户发送过来的 SQL 语句，首先对 SQL 语句做了 一些特定的分析：如分片分析、路由分析、读写分离分析、缓存分析等，然后将此 SQL 发往后端的真实数据库， 并将返回的结果做适当的处理，最终再返回给用户。下面是博主用于配置的主从及读写分离的机器：节点系统环境IPMySQL主从关系MySQL读 OR 写node3CentOS 7LNMP、JDK8192.168.17.130主写node4CentOS 7LNMP192.168.17.150主+从读Mycat部署与配置1、安装jdk环境此处安装的jdk版本为8，可前往官网下载，应保证其下载最低jdk版本不可低于7，其具体jdk配置可参考如下文章：[post cid="862" /]2、下载Mycat，下载地址为：http://dl.mycat.org.cn/，选择Linux环境的版本即可，此处下载的版本为1.6.7.4-release，按需下载并配置wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz #创建一个group groupadd mycat #创建一个新的用户，并加入group useradd -g mycat mycat # 解压缩 tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local #设置权限 chown -R mycat:mycat /usr/local/mycat3、修改Mycat内存配置、大家需要根据自己的机器实际内存情况进行配置vim /usr/local/mycat/conf/wrapper.conf # 大约35行左右，结合自己机器内存大小更改即可： wrapper.java.additional.9=-Xmx2G wrapper.java.additional.10=-Xms512M4、将Mycat添加至系统环境变量vim /etc/profile # 添加如下内容 MYCAT_HOME=/usr/local/mycat PATH=$MYCAT_HOME/bin:$PATH # 刷新系统环境变量 source /etc/profile5、配置Mycat账号密码和数据库名（server.xml）Mycat作为数据库的中间件，对于上层应用来说，他就是一个数据库。因此需要配置数据库的用户名，密码，数据库名，以及读写权限。user 用户配置节点相关参数说明：参数说明user用户配置节点--name登录的用户名，也就是连接Mycat的用户名--password登录的密码，也就是连接Mycat的密码--schemas数据库名，这里会和schema.xml中的配置关联，多个用逗号分开，例如需要这个用户需要管理两个数据库db1,db2，则配置db1,db2--privileges配置用户针对表的增删改查的权限--readOnly数据库是否设置为只读--defaultSchema默认数据库，错误前会尝试使用该schema作为schema，不设置则为null,报错vim /usr/local/mycat/conf/server.xml # 修改如下 <user name="root"> <property name="password">123456</property> <property name="schemas">typecho_db,dvwa_db</property> <property name="readOnly">false</property> <property name="defaultSchema">typecho_db</property> </user> 即配置一个用户名为root，密码为123456的用户，同时具有typecho_db,dvwa_db模式下的读写权限，注意该模式即是在schema.xml配置文件定义的模式名一样。6、配置Mycat的schema.xml文件vim /usr/local/mycat/conf/schema.xml # 相关配置 <?xml version="1.0"?> <mycat:schem…

MySQL主从复制
type: item
date: 2021-02-15T22:09:00+08:00
description: 本周在搭建集群的时候，特意将数据库也建立一个集群为以后方便扩容，故此处带大家了解一下MySQL的主从配置主从复制介绍原理主从复制是指一台服务器充当主数据库服务器，另一台或多台服务器充当从数据库服务器，主服务器中的数据自动复制到从服务器之中。对于多级复制，数据库服务器即可充当主机，也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志，从服务器通过主服务器的二进制日志自动执行更新。工作原理如图所示，主服务器上面的任何修改都会保存在二进制日志Binary log里面，从服务器上面启动一个I/O thread（实际上就是一个主服务器的客户端进程），连接到主服务器上面请求读取二进制日志，然后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log，如果发现有更改立即把更改的内容在本机上面执行一遍。如果一主多从的话，这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整，将二进制日志只给某一从，这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从，这样架构起来性能可能要好得多，而且数据之间的延时应该也稍微要好一些。复制过程1、Slave上面的IO进程连接上Master，并请求从指定日志文件的指定位置（或者从最开始的日志）之后的日志内容。2、Master接收到来自Slave的IO进程的请求后，负责复制的IO进程会根据请求信息读取日志指定位置之后的日志信息，返回给Slave的IO进程。返回信息中除了日志所包含的信息之外，还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。3、Slave的IO进程接收到信息后，将接收到的日志内容依次添加到Slave端的relay-log文件的最末端，并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中，以便在下一次读取的时候能够清楚的告诉Master从何处开始读取日志。4、Slave的SQL进程检测到relay-log中新增加了内容后，会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容，并在自身执行。下面是博主配置主从的服务器列表：节点系统环境IPMySQL主从关系node3CentOS 7LNMP192.168.17.130主node4CentOS 7LNMP192.168.17.150主+从主从配置注：在主从配置之前需要确保两台MySQL需要同步的库状态一致。主：配置文件默认在/etc/my.cnf下。在配置文件中新增配置：[mysqld] # 同一局域网内注意要唯一 server-id=1 # 开启二进制日志功能，名称可以随便取（关键） log-bin=mysql-bin # 二进制数据自动删除/过期天数设置，默认值为0，表示不自动删除 expire_logs_days = 7补充：若需要选择性的复制某些数据库，可在下方根据自己的需求选择性的加参数设置：binlog-do-db= 需要复制的数据库名，如果复制多个数据库，重复设置这个选项即可binlog-ignore-db= 不需要复制的数据库名，如果不需要复制多个数据库，重复设置这个选项即可此处并不推荐使用这两个设置需要同步与不同步的库，原因是binlog-do-db和binlog-ignore-db它们将语句写入了二进制日志. 意味着你不能使用二进制日志从备份恢复指定时间的数据；且过滤操作带来的负载都在主数据库服务器上，加重主数据库服务器负载。安全的操作则是在slave上配置过滤，来决定是否同步库或表。修改配置后需要重启才能生效：service mysql restart重启之后进入MySQL：mysql -uroot -p在master数据库创建数据同步用户，授予用户slave REPLICATION SLAVE权限和REPLICATION CLIENT权限，用于在主从库之间同步数据。CREATE USER 'slave'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';语句中的%代表所有服务器都可以使用这个用户，如果想指定特定的IP，将%改成IP即可。密码password请自定义查看主MySQL的状态：show master status;记录下File和Position的值，并且不进行其他操作以免引起Position的变化。从：在从my.cnf配置中新增：[mysqld] # 设置server_id,注意要唯一 server-id=2 …

MySQL创建用户、授权等相关操作
type: item
date: 2021-01-22T14:35:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：MySQL创建用户和授权是学习MySQL必备知识。创建用户通过`CREATE USER`命令，可指定用户名、主机和密码，允许本地或远程登录。授权使用`GRANT`命令，设置用户权限，包括数据库和表的操作权限。修改密码通过`SET PASSWORD`命令，撤销权限使用`REVOKE`命令。注意在操作后使用`FLUSH PRIVILEGES`刷新权限。删除用户和解决可能问题也是重要一环。配置文件修改和插件设置可解决远程连接问题。对于学习建站或正在学习MySQL语法知识的小伙伴，这波MySQL知识掌握是必不可少的。一、创建用户命令：CREATE USER 'username'@'host' IDENTIFIED BY 'password';命令说明：username：你将创建的用户名host：指定该用户在哪个主机上可以登陆，如果是本地用户可用localhost，如果想让该用户可以从任意远程主机登陆，可以使用通配符%password：该用户的登陆密码，密码可以为空，如果为空则该用户可以不需要密码登陆服务器举例：CREATE USER 'abc'@'localhost' IDENTIFIED BY '123456'; //创建用户：abc，密码：123456，仅本地用户可用 CREATE USER 'abc'@'192.168.17.135' IDENTIFIED BY '123456'; //创建用户：abc，密码：123456，指定192.168.17.135地址可登录(多个ip可使用英文逗号分隔) CREATE USER 'abc'@'%' IDENTIFIED BY '123456'; //创建用户：abc，密码：123456，可任意主机远程登录 CREATE USER 'abc'@'%' IDENTIFIED BY ''; //创建用户：abc，无密码，可任意主机远程登录 CREATE USER 'abc'@'%'; //创建用户：abc，无密码，可任意主机远程登录二、授权命令GRANT privileges ON databasename.tablename TO 'username'@'host'命令说明:privileges：用户的操作权限，如SELECT，INSERT，UPDATE，CREATE，DROP，DELETE等，如果要授予所的权限则使用ALLdatabase name：数据库名table name：表名，如果要授予该用户对所有数据库和表的相应操作权限则可用*表示，如*.*举例：GRANT SELECT, INSERT PRIVILEGES ON test.user TO 'abc'@'%'; //可任意主机登录的用户abc对test数据库中的user表授予SELECT和INSERT权限 GRANT ALL PRIVILEGES ON test.* TO 'abc'@'%'; //可任意主机登录的用户abc对test数据库授予所有操作权限 GRANT ALL PRIVILEGES ON *.* TO 'abc'@'%'; //可任意主机登录的用户abc对所有数据库和表授予所有操作权限注：用以上命令授权的用户不能给其它用户授权，如果想让该用户可以授权，可用以下命令（若无特定需求可无需此命令授予权限）:GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;若您需要自定义创建数据库，则创建数据库命令：CREATE DATABASE 数据库名;三、修改用户密码命令：SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');如果是当前登录用户修改密码：SET PASSWORD = PASSWORD('newpassword');举例：SET PASSWORD FOR 'abc'@'%' = PASSWORD('123456');四、撤销用户权限命令：REVOKE privilege ON databasename.tablename FROM 'username'@'host';其中privilege, database name, table name同授权部分说明举例：REVOKE SELECT ON *.* FROM 'abc'@'%'; //可任意主机登录的用户abc撤销对任意数据库和表的`SELECT`权限注意:假如你在给用户'abc'@'%'授权的时候是这样的（或类似的）：GRANT SELECT ON test.user TO 'abc'@'%'，则在使用REVOKE SELECT ON *.…