mysqldump 是一个用于 MySQL 数据库的命令行工具,用于备份数据库中的数据和结构。
mysqldump (-h + 服务器地址) -u用户名 -p密码 数据库名 > 备份文件.sql
-h + 服务器地址一般不写,默认对本机进行操作
若要备份所有的库,可以把数据库名写成 all
> 备份文件.sql :输出重定向,把备份的内容写入到一个文件中
mysqldump -uroot --all-databases --single-transaction --master-data=2 --flush-logs > /backup/`date +%F-%H`-mysql-all.sql
--single-transaction:在数据库在备份时不会受到数据变化(插入、更新、删除)的影响,保持数据一致性
--master-data=2:记录 binlog 的日志位置和文件名并追加到备份文件中
flush-logs: 在进行数据库备份之前,执行 flush-logs 可以创建一个新的二进制日志文件,以便将备份的和之前的日志文件分离开
`date +%F-%H`:日期格式化
vim /backup/2023-08-20-09-mysql-all.sql
mysql 锁机制:在备份文件时会锁定文件(去掉写入权限,只保留读取权限)
被 mysqldump 截断的二进制日志文件:
MASTER_LOG_POS=245 表示服务器在二进制日志文件中开始复制的位置
cp /var/lib/mysql/*bin* /tmp/mysql.log/
systemctl stop mariadb
rm -rf /var/lib/mysql/*
systemctl start mariadb
mysql -uroot < /backup/2023-08-20-09-mysql-all.sql
查看恢复后的数据:
通过查看数据可以发现,mysqldump 只能够恢复备份点之前的数据,而备份点到灾难点之间新增的数据则需要依靠 binlog 日志来恢复。
-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000003', MASTER_LOG_POS=245;
bin-log.000003 之前的日志文件已经备份过了,从 245 之后的是新内容
mysqlbinlog /tmp/mysql.log/bin-log.000003 --start-position=245 | mysql -uroot
/tmp/mysql.log/bin-log.000003:备份之后的二进制日志文件的位置
再次查看数据可以发现从备份点到灾难点之间新增的数据也恢复了:
vim /etc/my.cnf
修改后需要重启数据库
修改导出目录的属主和属组:chown mysql.mysql /backup
select * from test.t1 into outfile '/backup/test.t1.txt'
select * :全部文件
test.t1:库名.表名
'/backup/test.t1.txt':导出的文件位置
以 xml 形式导出:
mysql -uroot --xml -e 'select * from test.t1' > /backup/test.2.txt
delete from 表名;
!注意不要用 drop,drop 会把整个表的结构都清除,而 delete 只是清除表格中的内容。
load data infile '/backup/test.t1.txt' into table test.t1;
在文本文件中添加数据,也可以成功导入回数据库