尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

银河麒麟V10桌面版MySQL安装配置与主从复制全流程实战

银河麒麟V10桌面版MySQL安装配置与主从复制全流程实战 国产化环境落到桌面端之后开发机上装数据库这件事几乎每个团队都会遇到。银河麒麟V10桌面版基于Linux生态配合MySQL是很多人第一套要搭的环境。但真正上手你会发现网上搜到的教程要么是Ubuntu的、要么是CentOS的命令在麒麟上跑不通或者源里根本没有MySQL、只能装出个MariaDB甚至还有人被困在“装好了但登录不了”这一步。这篇文章就是来收尾的。我会把银河麒麟V10桌面版上MySQL的安装、基础配置、主从复制配置全流程写透所有命令都是我在真实环境里跑通的拿过去就能照着敲。覆盖两种安装路线在线仓库和离线bundle包、安全初始化、字符集调整、远程访问、数据目录迁移以及从零搭建一主一从的完整过程。适合刚拿到国产化机器需要装数据库的运维、开发、实施同学也适合想系统搞懂MySQL安装配置细节的新手。1. 安装前先想清楚版本、网络和依赖这三件事1.1 银河麒麟V10桌面版到底是个什么环境银河麒麟V10桌面版本质上是基于Linux生态的发行版软件包管理体系延续了Debian那一套也就是用apt和dpkg来装软件。桌面版默认自带图形界面但数据库的安装、配置、启动这些操作和服务器版没有本质区别大部分工作还是在终端里完成的。这里有一个非常关键的细节银河麒麟V10有x86_64和ARMaarch64两种架构不同机器可能用的完全不同的CPU。下载安装包之前必须先确认架构x86机器选amd64的包ARM机器选arm64的包。我曾经见过有人在飞腾处理器上装了x86的deb包结果一运行就报非法指令白折腾半天。另外银河麒麟V10底下的base系统并不统一有的版本基于Debian有的基于Ubuntu这导致在线仓库的方式有不确定性。所以我的建议是如果机器能联网可以试官方仓库如果在内网或者网络策略严格直接用deb bundle离线包这个方法在任何Debian系的发行版上都稳包括银河麒麟各版本。1.2 MySQL版本怎么选为什么要选官方发行版版本选择上生产环境我更推荐MySQL 8.0系列比如8.0.36这种成熟稳定的版本或者直接上8.4 LTS长期支持版。9.x这种innovation版本功能新但迭代快不适合放在需要长期维护的环境里。这里要单独提醒一句银河麒麟默认源里那个mysql-server包实际上安装出来的是MariaDB不是MySQL。MariaDB虽然是MySQL的分支很多命令和表结构兼容但业务系统如果对MySQL的某些行为特性有强依赖两者之间还是有差异的尤其是账号认证插件、性能模式、部分SQL语法上。既然项目需求明确是MySQL就老老实实用MySQL官方包不要在源里图省事。1.3 联网和离线的两种安装路线怎么定线路A是配置MySQL官方APT仓库在线安装适合机器能直接访问外网的场景。线路B是下载deb bundle离线包适合内网、离线、或者不想折腾仓库识别的场景。我个人的实战经验是优先推荐线路B。原因有三点。第一信创环境普遍网络策略严格在线仓库经常超时第二官方APT仓库配置包在银河麒麟这种非标准系统上识别发行版容易出偏差虽然能用但多一道麻烦第三bundle包一次下载完拷贝到机器上直接装整个流程是确定性的出了问题也好排查。后面我会把两条路都写清楚你根据手里的机器情况选。2. 一步一步装好MySQL从下载到服务启动2.1 在线仓库方式的完整命令机器能联网的话可以用在线方式。先下载MySQL官方的APT仓库配置包wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb安装过程会弹出蓝底配置界面让你选MySQL版本。这里有个坑它默认检测到你的系统可能是Debian或Ubuntu但银河麒麟不一定在列表里所以它可能会自动选一个相近的选项一般来说选Ubuntu 20.04或Debian 11都能正常用关键是最后一步要确保选中了MySQL 8.0或8.4。选择完成后sudo apt update sudo apt install mysql-server这条路最大的变数就是仓库识别。如果apt update时报错说仓库不支持你的发行版那会非常头疼需要手动改/etc/apt/sources.list.d/mysql.list里的发行版代号。有这个折腾的功夫离线包早就装完了。所以能走B线就别走A线。2.2 离线bundle包方式重点推荐这条路线是我实测下来最省心的。先去MySQL官网下载页面选操作系统注意不是选“银河麒麟”而是选“Ubuntu Linux”或“Debian”系列架构和你的机器对应x86选amd64ARM选arm64。在下方列表里找那个名字类似于mysql-server_8.0.36-1debian11_amd64.deb-bundle.tar的包这就是包含所有组件的大包。把包拿回机器上解压mkdir mysql_bundle tar -xvf mysql-server_8.0.36-1debian11_amd64.deb-bundle.tar -C mysql_bundle/ cd mysql_bundle先装依赖这是很多人卡住的第一步sudo apt update sudo apt install -y libaio1 libmecab2 libnuma1 psmisc接下来按照严格的顺序用dpkg安装。顺序不能乱因为server包依赖clientclient依赖common一层层往上叠sudo dpkg -i mysql-common_*.deb sudo dpkg -i mysql-community-client-plugins_*.deb sudo dpkg -i mysql-community-client-core_*.deb sudo dpkg -i mysql-community-client_*.deb sudo dpkg -i mysql-client_*.deb sudo dpkg -i mysql-community-server-core_*.deb sudo dpkg -i mysql-community-server_*.deb sudo dpkg -i mysql-server_*.deb注意这里用通配符是有讲究的。解压出来的文件里除了这些核心包还有mysql-community-test、mysql-community-bench之类的包如果你直接sudo dpkg -i *.deb会装一堆用不上的东西甚至因为依赖顺序问题直接报错。所以我建议一行一行来或者用tab键补全文件名确保只安装需要的包。安装过程中会弹出设置root密码的界面输入两次相同的密码即可。如果用的环境没有弹出界面比如纯命令行缺少对话框组件MySQL会以默认方式初始化这种情况稍后用mysql_secure_installation或手动SQL重新设置root密码就行。2.3 启动服务与首登验证安装完成后启动MySQL服务并设置开机自启sudo systemctl start mysql sudo systemctl enable mysql sudo systemctl status mysql看到active (running)就代表服务起来了。然后登录验证mysql -uroot -p输入刚才设置的root密码进入MySQL命令行后执行SELECT VERSION();能返回版本号说明MySQL已经正常工作。如果提示无法登录先看看错误信息。最常见的情况是root密码没设置成功或者认证插件不匹配。后面排查章节我会详细说。3. 基础配置初始化、字符集、远程访问与参数调优3.1 安全初始化把数据库收拾利索MySQL刚装好的状态比较“原生”很多默认项不安全。官方提供了一个交互式脚本mysql_secure_installation建议装完立刻跑一遍sudo mysql_secure_installation它会依次问几个问题是否设置密码验证策略建议选强密码当然你要是内网测试环境嫌麻烦也可以跳过、是否移除匿名用户选Y、是否禁止root远程登录选Y、是否移除test测试库选Y、是否立即刷新权限表选Y。这一步之所以重要是因为MySQL 8.0默认装完会有一个匿名用户允许任何人从本地免密登录这在开发机上问题不大但一旦机器暴露在局域网上就是安全隐患。如果你不想用交互脚本也可以直接SQL搞定DELETE FROM mysql.user WHERE User; FLUSH PRIVILEGES;顺带一提MySQL 8.0默认root的认证插件是caching_sha2_password比老版本的mysql_native_password安全但某些老客户端可能不支持。如果遇到客户端连不上且报认证相关错误可以在MySQL里把指定用户的认证方式改掉不过我的建议是优先升级客户端而不是降低数据库的安全标准。3.2 字符集改成utf8mb4避免生僻字和Emoji乱码MySQL 8.0默认字符集已经接近utf8mb4但为了保险起见还是建议显式配置。字符集这个东西等数据写进去了再改很麻烦最好的时机就是刚装完的阶段。编辑MySQL配置文件路径是/etc/mysql/mysql.conf.d/mysqld.cnf在[mysqld]段落下面加两行character_set_serverutf8mb4 collation_serverutf8mb4_0900_ai_ci然后重启服务sudo systemctl restart mysql mysql -uroot -p -e SHOW VARIABLES LIKE character%;看到character_set_server的值是utf8mb4就成功了。为什么选utf8mb4因为MySQL的老字符集utf8utf8mb3只能存3字节的字符遇到表情符号、生僻字直接报错或者变问号。而utf8mb4是完整的4字节编码主流数据库现在基本都默认这个。3.3 创建业务用户解决远程访问问题默认情况下root用户只允许从localhost连接这是安全策略不建议改。实际使用中应该创建一个业务专用账号并授予它需要的权限。比如创建一个给应用用的账号CREATE USER appuser% IDENTIFIED BY App2024; GRANT ALL PRIVILEGES ON *.* TO appuser%; FLUSH PRIVILEGES;%表示允许从任意主机连接你也可以换成具体IP增加限制比如appuser192.168.1.%。远程连接不上时按这三个顺序排查。第一看MySQL有没有监听在外网端口上默认配置下MySQL只监听127.0.0.1需要检查配置文件里有没有bind-address127.0.0.1这样的行有的话改成0.0.0.0并重启。第二看系统防火墙有没有放行3306端口银河麒麟桌面版可能开着ufw或firewalldsudo ufw status sudo ufw allow 3306/tcp或者如果是firewalldsudo firewall-cmd --permanent --add-port3306/tcp sudo firewall-cmd --reload第三看用户表里有没有允许对应来源IP的账号。3.4 数据目录迁移到数据盘可选但推荐很多桌面版机器会有单独的数据盘挂载系统盘通常不大。把MySQL数据目录从/var/lib/mysql迁到大容量分区能避免以后数据膨胀导致系统盘爆掉。整个过程不难但有个关键点很容易忽略。先停服务sudo systemctl stop mysql把数据目录完整复制到新位置sudo rsync -av /var/lib/mysql/ /data/mysql/修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf把datadir/var/lib/mysql改成datadir/data/mysql修改目录属主sudo chown -R mysql:mysql /data/mysql关键点来了如果系统启用了AppArmor它会限制mysqld只能访问/var/lib/mysql复制完直接启动会报权限错误。需要检查/etc/apparmor.d/usr.sbin.mysqld里有没有对datadir的限制有的话就加上对应规则然后sudo systemctl restart apparmor。最后再启动MySQLsudo systemctl start mysqlmysql -uroot -p登录后执行SHOW VARIABLES LIKE datadir;确认路径已经切换。这一步建议在写入重要数据之前做不然迁移过程中数据量越大停机时间越长。3.5 常用性能参数与开机自启MySQL默认配置是为通用场景准备的在开发机或者业务量不大的生产环境调整几个关键参数就能明显改善性能。编辑mysqld.cnf在[mysqld]下按机器内存情况调整innodb_buffer_pool_size 1G max_connections 200 wait_timeout 600 interactive_timeout 600innodb_buffer_pool_size是InnoDB的缓冲池大小也是MySQL性能影响最大的参数。经验值是物理内存的50%~70%比如8G内存的机器设4G~5G2G内存的小机器设1G就差不多了。设太大反而会因为内存不足触发swap得不偿失。max_connections默认151开发环境200足够生产环境根据并发量弹性调整。注意连接数不是越大越好每个连接都会占用线程和内存。最后确认开机自启已经设置sudo systemctl is-enabled mysql如果输出不是enabled执行sudo systemctl enable mysql4. 主从复制从零搭建一套读写分离的基础架构4.1 先理解主从复制在干什么主从复制听起来高大上原理其实不复杂。主库Master把所有的数据变更记录到二进制日志binlog里从库Slave有两个线程在干活IO线程负责去主库拉取binlog日志SQL线程负责把拉回来的日志在本地重新执行一遍。严格来说从库就是主库的一个“回放器”把主库做过的事重复做一遍。打个比方主库是记账的会计每一笔交易都写在流水账本binlog上从库是抄账的助理会计每写一笔助理就照着抄一笔到自己的账本上最终两本账的内容是对齐的。这个机制能带来三个实际价值一是热备份从库上有完整的冗余数据二是读写分离主库扛写入、从库扛查询三是容灾主库挂了能把从库提升为主库继续服务。MySQL 8.0时代强烈建议直接用GTID全局事务标识符模式的复制。原来的老式复制是基于日志文件名和日志位置的比如要从mysql-bin.000003的第1204个字节开始同步一旦位置记错了或者日志被清理了就会出问题。GTID模式给每个事务分配一个全局唯一ID从库自动根据GTID判断该从哪个事务接着同步不需要手工记录文件和位置容错性高得多。4.2 主库配置三步搞定假设主库IP是192.168.1.100从库IP是192.168.1.101。第一步在主库的mysqld.cnf里加[mysqld] server-id1 log-binmysql-bin gtid_modeON enforce_gtid_consistencyON binlog_formatROWserver-id是实例的唯一标识主库从库必须不同否则复制链路会串。log-bin打开二进制日志这是复制的数据源。binlog_formatROW是行级复制比默认的STATEMENT更安全因为它记录的是每一行数据的变化而不是SQL语句本身。配置完重启sudo systemctl restart mysql第二步在主库上创建专用的复制账号。这个账号只用来做复制不要授予其他权限CREATE USER repl% IDENTIFIED BY Repl2024; GRANT REPLICATION SLAVE ON *.* TO repl%; FLUSH PRIVILEGES;第三步确认主库状态SHOW MASTER STATUS\G如果显示File和Position字段有值说明binlog已经开启。在GTID模式下记录一下Executed_Gtid_Set的值后面从库配置时能参考。4.3 全量数据同步先把两边拉到同一水平线主从复制不是从零开始同步而是从“某一时刻”之后开始同步。所以在配置复制之前要先把主库当前的数据原封不动搬到从库。如果直接配置复制而两边数据不一致从库重放日志时会因为找不到对应行而报错。在主库上执行全量导出mysqldump -uroot -p --all-databases --single-transaction --master-data2 --routines --triggers --events all.sql参数说明--single-transaction在InnoDB引擎下通过事务一致性快照保证导出过程中数据不锁表--master-data2会在备份文件头部自动记录当前binlog文件名和位置如果将来要切换成基于位点的方式这个信息就是现成的--routines和--triggers确保存储过程、函数、触发器都被导出来。把生成的all.sql传到从库然后导入mysql -uroot -p all.sql这一步要耐心数据量大时需要一段时间。4.4 从库配置与复制链路启动在主库配置完并导出数据的同时从库这边也要做准备。修改从库的mysqld.cnf[mysqld] server-id2 log-binmysql-bin gtid_modeON enforce_gtid_consistencyON read_onlyONserver-id不能和主库一样这里设成2。read_onlyON表示从库不允许普通用户写入避免误操作污染从库数据、导致复制中断。注意read_only对超级权限账号不起作用也就是说root还是能写的但要克制从库上只用root做维护操作。配置好重启sudo systemctl restart mysql登录从库执行复制链路的配置命令CHANGE MASTER TO MASTER_HOST192.168.1.100, MASTER_USERrepl, MASTER_PASSWORDRepl2024, MASTER_AUTO_POSITION1, GET_MASTER_PUBLIC_KEY1;最后一个参数GET_MASTER_PUBLIC_KEY1是MySQL 8.0里常见的坑。因为8.0默认认证插件是caching_sha2_password在非SSL连接下手动配置复制链路时需要获取主库公钥不加这个参数IO线程会一直卡在连接阶段报错提示认证插件需要RSA公钥。然后是启动复制并查看状态START SLAVE; SHOW SLAVE STATUS\G重点关注三行Slave_IO_Running: Yes表示IO线程已经连上主库并能拉日志。Slave_SQL_Running: Yes表示SQL线程正常重放日志。Seconds_Behind_Master: 0表示延迟为0同步及时。如果前两个都是Yes主从复制就建好了。4.5 验证复制是否真的生效配置完成不等于万事大吉一定要亲手验证一遍。在主库上执行CREATE DATABASE testdb; USE testdb; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO t_user(name) VALUES (张三),(李四);然后登录从库USE testdb; SELECT * FROM t_user;能看到刚才插入的两条记录说明复制链路是通的。再回主库多插入几条数据在从库反复查询确认实时同步效果。顺便说一句如果只是想验证GTID链路也可以在从库执行SHOW SLAVE STATUS\G看Retrieved_Gtid_Set和Executed_Gtid_Set是否在持续增长这也说明了同步在正常推进。5. 踩坑经验与问题排查实录5.1 安装阶段的常见报错离线安装时最常见的报错是依赖缺失比如dpkg: dependency problems prevent configuration of mysql-community-server mysql-community-server depends on libaio1; however: Package libaio1 is not installed.解决方式很简单缺什么补什么sudo apt install -y libaio1 libmecab2 libnuma1 psmisc另一种常见情况是安装顺序不对比如先装了server包后装common包dpkg会提示conflicts with或者depends on。这不是包有问题而是顺序问题。按前面给的顺序重新来一遍就行不需要反复卸载重装。还有一个容易被忽略的问题如果这台机器之前装过MariaDB3306端口可能被占用。安装前先检查sudo ss -tlnp | grep 3306有输出就先把原来的库停掉、卸载干净再装MySQL。5.2 远程连接不上和权限报错远程连接不上时不要病急乱投医按错误信息对症下药。报Host 192.168.1.50 is not allowed to connect to this MySQL server说明用户权限里没有允许该主机的连接。检查mysql.user表里对应用户的Host字段SELECT user, host FROM mysql.user;如果需要允许任意主机执行CREATE USER appuser% IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO appuser%; FLUSH PRIVILEGES;报Cant connect to MySQL server on 192.168.1.100 (10060)说明网络层面不通。这种情况先ping一下确认主机通不通然后检查防火墙有没有放行3306。银河麒麟桌面版用ufw还是firewalld取决于系统版本两个都查一遍更稳。还有一个关键点检查MySQL的bind-address。如果配置文件里写的是bind-address127.0.0.1那不管防火墙怎么放行外部都连不上。MySQL默认安装时很多时候只监听本机改成0.0.0.0并重启服务才能被局域网访问。5.3 从库复制中断的排查方法主从复制搭建时最让人头疼的就是Slave_IO_Running和Slave_SQL_Running的状态不是Yes。IO线程显示Connecting优先检查三个问题。第一从库的server-id是不是和主库一样第二账号repl的密码是不是正确第三是不是caching_sha2_password认证问题导致连接被拒。前两个都好排查第三个的话就是在CHANGE MASTER TO时加上GET_MASTER_PUBLIC_KEY1。另外看从库错误日志是最准确的判断方式sudo tail -100 /var/log/mysql/error.logSQL线程显示No一般是主从数据不一致导致的。比如从库上有手动写入的数据和主库的binlog事务冲突或者全量导入过程中出了差错。查看SHOW SLAVE STATUS\G里的Last_SQL_Error字段定位具体是哪里报错。如果经过判断确实是可以跳过的错误在老式位点模式下可以这样处理STOP SLAVE; SET GLOBAL sql_slave_skip_counter1; START SLAVE;这个做法意思是不执行当前这条出错的事务继续往下走。但在GTID模式下这个命令不受支持而且频繁跳过事务会掩盖问题。我的建议是如果从库数据已经乱了最稳妥的办法是重新做一遍全量同步。从主库重新mysqldump导出后到从库清空重导然后重新START SLAVE。数据可靠性面前不要图省事。5.4 忘记root密码的救援操作root密码忘了是迟早会遇到的事。MySQL 8.0的救援思路是用skip-grant-tables参数绕过权限验证启动数据库。先停服务sudo systemctl stop mysql编辑配置文件临时加一行[mysqld] skip-grant-tables启动MySQLsudo systemctl start mysql此时不需要密码就能登录mysql -uroot登录后立即执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass2024;这里有个细节如果跳过FLUSH PRIVILEGES直接执行ALTER USERMySQL可能会报Unknown system variable skip_grant_tables之类的异常先刷新权限让认证模块重新加载再改密码才稳妥。改完密码后停服务把配置文件里的skip-grant-tables删掉再启动MySQL。这个操作期间数据库是完全没有访问控制的相当于大门敞开所以只适合在没人连接的维护窗口做而且做完必须立刻恢复。写在最后的一些体会搭了这么多年数据库环境我对银河麒麟这类国产系统最大的心得就是拿到机器先别急着装软件花两分钟搞清楚系统架构和包管理体系能省下后面一大半的排错时间。uname -m看架构cat /etc/os-release看系统版本这俩命令值得形成肌肉记忆。再分享一个小技巧信创环境的网络策略普遍比较严格能离线解决的安装问题尽量不要依赖在线源。把deb bundle包存到U盘或者内网共享目录里无论在麒麟、统信还是Debian系的其他系统上这套流程都能复用。以后碰到新机器直接按这篇文章的步骤走一遍MySQL就能稳稳当当跑起来。主从复制这套链路搭好之后还可以继续往深里做比如加上半同步复制保证数据不丢或者用MHA做自动故障切换。不过那都是后面的事了先把基础环境和复制链路跑通你就已经领先很多人了。
返回列表