数据库常用操作

104 阅读2分钟
概览
阅读人群后端开发
本文字数约等于 502 字
阅读时间约等于 3 分钟
涉及知识mysql 主备,mysql 备份,mysql 恢复

数据库的备份与还原

mysql8.0之前

  • mysqldump
  • pxb(Percona XtraBackup)

mysql8.0之后

  • mysqldump
  • pxb(Percona XtraBackup)
  • clone插件

mysqldump 的使用

# mysql 的备份

mysqldump -h${MYSQL_IP} -P3306 -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} --all-databases > alldb.sql;

# mysql 的还原

mysql  -h${MYSQL_IP} -P3306 -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -e "source alldb.sql";

数据库主从配置搭建

# -1. 关闭所有的服务,关闭 mysql 的 io 线程
processList=($(execute_remote_command "mysql -u${mysql_username} -p${mysql_password} -h${SERVER_IP} -P3306 -e 'show processlist\G' " | grep "Id"| grep -v "Id: 1$"  |awk '{print $2}'))
for process in ${processList[@]};do
  execute_remote_command "mysql -u${mysql_username} -p${mysql_password} -h${SERVER_IP} -P3306 -e 'kill ${process};'"
done

#0.使用 mysqldump 导出数据,并导入到从库
mysqldump -h${MYSQL_IP} -P3306 -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} --all-databases > alldb.sql;

mysql  -h${MYSQL_IP} -P3306 -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -e "source alldb.sql";

## 1.查看数据库 binlog 功能是否打开
show master status;

zarek=$(mysql -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -e "show master status;" | grep  -c "mysql-bin"  )

## 2.创建主从复制所需要的操作用户

mysql -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -e "grant replication slave,replication client on *.* to repl@'%' identified by 'xxxxxx';"

## 3.开启从数据库同步
### 1.先停止 slave
stop slave;

### 2.更改 slave 配置
change master to master_host='${MASTER_MYSQL_IP}',master_port=3306,master_user='repl',master_password='xxxxxxxT',master_log_file='mysql-bin.000004',master_log_pos=537243095;

### 3.启动 slave
start slave;

### 4.查看 slave 状态
show slave status \G

image.png

看到

Slave_IO_Running: Yes
Slave_SQL_Runing: Yes

则数据库主从开启成功

修改数据库的密码

密码未存在的情况

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

mysqladmin -u username -h hostname -p password "newpwd"

数据库删除 root 用户之后的恢复操作

  1. 修改数据库配置文件 my.cnf 配置, 在 [mysqld] 节下加入 skip-grant-tables 配置,重启数据库

  2. 不使用密码连上数据库,执行插入root用户的sql脚本

    INSERT INTO `mysql`.`user`(`Host`, `User`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `Event_priv`, `Trigger_priv`, `Create_tablespace_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`, `password_last_changed`, `password_lifetime`, `account_locked`) VALUES ('%', 'root', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', 0, 0, 0, 0, 'mysql_native_password', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'N', '2022-08-10 15:59:18', NULL, 'N');
    
  3. 删除 my.cnf 中的 skip-grant-tables 配置,重启数据库

  4. 使用 mysql -uroot -pxxxxx 连接数据库

踩坑点

1.从库的 server-id 和主库的 server-id 不能一样(在配置文件中修改)

reference

MySQL修改root用户密码