我目前正在使用读/写拆分模式下的 3 个节点的 Galera 集群测试 Maxscale。默认情况下,Maxscale 将一个节点定义为主节点,另一个节点定义为从节点(我的配置是 100% 的从节点)。
我的目的是检查 Maxscale 如何处理节点关闭。
问题在于,使用基准测试(Sysbench、Mysqlslap)和自定义脚本 (PHP),当我关闭集群的一个节点时,与后端 (MariaDB) 的连接会丢失。
错误日志:
MariaDB Corporation MaxScale /var/log/maxscale/error1.log Thu Oct 29 13:00:11 2015
-----------------------------------------------------------------------
--- Logging is enabled.
2015-10-29 13:00:11 Error: Failed to obtain address for host ::1, Address family for hostname not supported
2015-10-29 13:00:11 Warning: Failed to add user root@::1 for service [RW Split Router]. This user will be unavailable via MaxScale.
2015-10-29 13:00:11 Warning: Duplicate MySQL user found for service [RW Split Router]: cmon@127.0.0.1 …Run Code Online (Sandbox Code Playgroud) 我试图在我的 sql 服务器上运行以下查询:
CREATE TABLE `e_store`.`products`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(250) NOT NULL ,
`brand_id` INT UNSIGNED NOT NULL ,
`category_id` INT UNSIGNED NOT NULL ,
`attributes` JSON NOT NULL ,
PRIMARY KEY(`id`) ,
INDEX `CATEGORY_ID`(`category_id` ASC) ,
INDEX `BRAND_ID`(`brand_id` ASC) ,
CONSTRAINT `brand_id` FOREIGN KEY(`brand_id`) REFERENCES `e_store`.`brands`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE ,
CONSTRAINT `category_id` FOREIGN KEY(`category_id`) REFERENCES `e_store`.`categories`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
我的 e_store 数据库中已经有品牌和类别表。
但我收到以下错误:
#1064 - You have …Run Code Online (Sandbox Code Playgroud) 问这个问题之前,我搜索了stackoverflow,发现了一个类似的帖子:
mariadb galera - Error when a node shutdown ERROR 1047 WSREP尚未准备好节点供应用程序使用
但是,帖子是双节点集群,我的是三节点集群,并且在每个节点中,mariadb 都运行如下:
控制器 1:
[root@controller1 mysql]# systemctl status mariadb
? mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
??migrated-from-my.cnf-settings.conf
Active: active (running) since Tue 2017-07-04 19:34:22 CST; 19h ago
Main PID: 3785 (mysqld)
Status: "Taking your SQL requests now..."
CGroup: /system.slice/mariadb.service
??3785 /usr/sbin/mysqld --wsrep_start_position=de05f291-60a9-11e7-a641-13dca5e08098:0
Jul 05 14:52:54 controller1 mysqld[3785]: 2017-07-05 14:52:54 139817407719168 [Note] WSREP: applier thread exiting (code:6)
Jul 05 14:52:54 controller1 …Run Code Online (Sandbox Code Playgroud) 我可以通过提供不带任何证书的 --ssl 选项从 Sequel Pro(参见这篇文章)和控制台连接到 MySQL/MariaDB :
$ mysql -u myusername -p -h 10.123.45.67 --ssl
Enter password:
Welcome to the MariaDB monitor.
Run Code Online (Sandbox Code Playgroud)
不使用 --ssl 连接是不可能的,因为用户需要 SSL:
$ mysql -u myusername -p -h 10.123.45.67
Enter password:
ERROR 1045 (28000): Access denied for user 'myusername'@'10.123.45.67' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
如何使用 PDO 在 PHP 中实现相同的功能?
我已经研究了过去几个小时,但没有找到解决方案。我尝试修改提供给 PDO 构造函数的 dsn 和选项参数,但没有成功。我要么最终得到错误代码 1045(访问被拒绝)或 2002(无法通过套接字连接):
$pdo = new PDO('mysql:dbname=...;host=10.123.45.67;port=3306', 'myusername', '...');
Run Code Online (Sandbox Code Playgroud)
PHP 致命错误:未捕获的 PDOException:SQLSTATE[HY000] [1045] 用户“myusername”@“10.123.45.67”的访问被拒绝(使用密码:YES)
添加PDO::MYSQL_ATTR_SSL_KEY(和其他)作为 PDO 构造函数的选项,导致 2002(这些选项没有意义,因为我没有密钥等)。虽然我不知道如何以与从控制台或在 Sequel …
我测试 sql 查询。
IF 3 = 3 THEN
SELECT 'TRUE'
ELSE
SELECT 'FALSE'
END IF;
Run Code Online (Sandbox Code Playgroud)
我在 SQLyog 上执行了该查询。
我收到以下错误消息。
You have an error in your SQL syntax; check the manual that corresponds to
your MariaDB server version for the right syntax to use near 'ELSE SELECT
'FALSE' END IF' at line 3
Run Code Online (Sandbox Code Playgroud)
该查询非常简单。我不知道为什么会出现错误消息。
尝试根据以下页面启用常规的基于密码的身份验证:https : //mariadb.com/kb/en/library/authentication-plugin-unix-socket/
该页面建议使用以下代码:
ALTER USER root@localhost IDENTIFIED VIA mysql_native_password;
SET PASSWORD = PASSWORD('foo');
Run Code Online (Sandbox Code Playgroud)
但在我的机器上它失败并出现语法错误:
MariaDB [(none)]> ALTER USER root@localhost IDENTIFIED VIA mysql_native_password;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER root@localhost IDENTIFIED VIA mysql_native_password' at line 1
MariaDB [(none)]> SET PASSWORD = PASSWORD('foo');
Query OK, 0 rows affected, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud) MariaDb 的默认端口是什么?
我是编程新手。我正在创建我的第一个连接到 MariaDB 的 Java 应用程序。我需要指定数据库端口。
当需要从 PostgreSQL 切换到 MariaDB/MySql 时,我遇到了列 json 的问题。
我使用 Spring Boot + JPA + Hibernate + hibernate-types-52。
我要映射的表是这样的:
CREATE TABLE atable(
...
acolumn JSON,
...
);
Run Code Online (Sandbox Code Playgroud)
好的,它适用于 PostgreSQL 和 MariaDB/MySql。
问题是当我想部署一个可以轻松从一个切换到另一个的应用程序时,因为 PostgreSQL 和 MySQL/MariaDB 的正确 hibernate-types-52 实现是不同的
这适用于 MySQL/MariaDB
@Entity
@Table(name = "atable")
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class Atable {
...
@Type(type = "json")
@Column(name = "acolumn", columnDefinition = "json")
private JsonNode acolumn;
...
}
Run Code Online (Sandbox Code Playgroud)
这适用于 PosgreSQL
@Entity
@Table(name = "atable")
@TypeDef(name = "json", typeClass = JsonBinaryType.class)
public …Run Code Online (Sandbox Code Playgroud) 除了拥有 mariadb 10.1.36-MariaDB 之外,我还收到以下错误。
EXPLAIN ANALYZE select 1
MySQL said: Documentation
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ANALYZE select 1' at line 1
Run Code Online (Sandbox Code Playgroud)
我还需要在这里做什么。我的 PHP 版本是 7.2.11。
我试图让我的 docker db 容器在创建时使用数据集自动填充数据库。根据mariadb 文档,卷中有一个docker-entrypoint-initdb.d文件夹可用于此目的。
我将我的docker-compose.yml文件设置为镜像我在 StackOverflow 上找到的示例,但仍然无法执行我的 SQL 脚本。以下是我的docker-compose.yml文件的相关部分:
version: '3.6'
services:
db:
image: mariadb:10.5.4-focal
container_name: db
volumes:
- ./cms/conf/mysql/data/:/var/lib/mysql/:rw
- ./cms/sql/:/docker-entrypoint-initdb.d/:ro
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=wordpress
restart: always
adminer:
image: adminer:4.7.7-standalone
container_name: adminer
links:
- db
ports:
- 8080:8080
restart: always
Run Code Online (Sandbox Code Playgroud)
在docker-compose.yml文件旁边,我有一个cms/sql/init.sql包含以下内容的文件:
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `test`;
Run Code Online (Sandbox Code Playgroud)
在每次测试迭代之前,我会清理所有旧的/缓存的 Docker 内容:
$ docker-compose …