如何完全重置 mysql 的复制设置,而无需重新安装它?

如何完全重置 mysql 的复制设置,而无需重新安装它?
  1. 我通过在 my.cnf 中添加对 binlog、中继日志等的引用来设置 mysql 复制
  2. 重新启动mysql,成功了。
  3. 我想改变它,所以我删除了所有 binlog 相关文件,包括 log-bin.index,
  4. 从 my.cnf 中删除 binlog 语句
  5. 重启服务器,正常运行
  6. 将主服务器设置为'',清除自现在以来的主服务器日志(),重置从服务器,停止从服务器,停止主服务器。
  7. 现在,为了再次设置复制,我向服务器添加了 binlog 语句。但是当我使用以下命令重新启动时,我遇到了这个问题:

    sudo mysqld
    

(查看mysql启动错误的唯一方法)

我收到此错误:

/usr/sbin/mysqld: File '/etc/mysql/var/log-bin.index' not found (Errcode: 13)

因为实际上,这个文件不存在!(我在尝试设置新的复制系统时删除了它)嗯,如果我将配置行更改为:

log-bin-index = log-bin.index

我收到一个不同的错误:

[ERROR] Can't generate a unique log-filename /etc/mysql/var/bin.(1-999)
[ERROR] MSYQL_BIN_LOG::open failed to generate new file name.
[ERROR] Aborting

我第一次在此系统上设置复制时,不需要创建此文件。我做了同样的事情 - 添加了对以前不存在的文件的引用,然后 mysql 创建了它。中继日志等也是如此。

我不知道为什么 mysql 坚持尝试读取旧文件夹。

我是否应该重新安装整个软件包?这似乎有点过头了。

我的my.cnf:

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
user        = mysql
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
skip-external-locking
bind-address        = IP
key_buffer      = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
table_cache            = 64
sort_buffer            =64K
net_buffer_length      =2K
query_cache_limit       = 1M
query_cache_size        = 16M
slow_query_log_file     = /etc/mysql/var/mysql-slow.log
long_query_time        = 1
log-queries-not-using-indexes
expire_logs_days        = 10
max_binlog_size         = 100M

server-id = 3
log-bin = /etc/mysql/var/bin.log
log-slave-updates
log-bin-index = /etc/mysql/var/log-bin.index
log-error = /etc/mysql/var/error.log

relay-log = /etc/mysql/var/relay.log
relay-log-info-file = /etc/mysql/var/relay-log.info
relay-log-index = /etc/mysql/var/relay-log.index

auto_increment_increment = 10
auto_increment_offset = 3
master-host = HOST
master-user = USER
master-password=PWD
replicate-do-db = DBNAME
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
#no-auto-rehash

[myisamchk]
key_buffer_size = 16M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout

!includedir /etc/mysql/conf.d/

更新:将 binlog 和中继日志语句中的所有 /etc/mysql/var/xxx 路径更改为本地已在某种程度上解决问题。

我起初以为是 apparmor 造成的,但是当我将 /etc/mysql/* rw 添加到 apparmor 的配置并重新启动它时,它仍然无法读取完整路径。

答案1

首先,重新安装 mysql 并不是真正的解决方案。特别是如果您指的是删除并安装软件包 —— 这不会影响数据目录中的文件,您的问题也不会改变。

其次,您永远不必触碰磁盘上的 binlog 文件——从文件系统中删除它们并不是管理它们的正确方法。mysql 中有一些命令可以删除旧日志。MySQL 还必须维护索引文件,因此磁盘上的文件与其保留的现有 binlog 列表相匹配。请参阅清除二进制日志

所以,您陷入困境是因为您做出了假设并触碰了不该触碰的文件。

此错误:

/usr/sbin/mysqld: File '/etc/mysql/var/log-bin.index' not found (Errcode: 13)

并不意味着它不存在;错误 13 表示“权限被拒绝”,这可能意味着 mysql 无法写入/etc/mysql/var/

您现在真正需要做的就是修复/etc/mysql/var/ 以下权限: chown mysql:mysql /etc/mysql/var; chmod 0775 /etc/mysql/var

如果没有 .index 文件,也没有 binlogs,mysql 将从头开始并创建所需的文件。删除该目录下的所有文件。

答案2

/etc/mysql/var/似乎不是正确路径,您应该检查您的datadir设置。它应该是类似/var/lib/mysql

相关内容