leadscloud

Google SEO|外贸营销推广

Wordpress 使用 Eelementor 插件时,编辑内容,会保存到wp_postmeta中,对于中文一些替换插件 Better Search Replace 等没有问题,但如果是中文,你会发现使用替换工具替换后,内容不变。

这主要是因为中文内容保存为json格式后,会编码为unicode格式,所以无法替换,可以使用下面方法替换。

1
select count(*) from wp_postmeta where meta_value like '%\\\\u539f\\\\u59cb\\\\u5b57%\\\\u7b26';

SELECT语句中四个反斜杠(\)代表一个.
在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到””,就要反转义两次,也就是由”"到”"再到””。
如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。

比如 原始字符 替换为 替换字符

1
2
3
4
5
6
UPDATE wp_postmeta 
SET meta_value = REPLACE(
meta_value,
'\\\u539f\\\u59cb\\\u5b57\\\u7b26',
'\\\u66ff\\\u6362\\\u5b57\\\u7b26'
);

可以使用js的 escape 来把中文转为unicode编码

wordpress内容替换SQL语句

1
2
3
UPDATE wp_options SET option_value = replace(option_value, 'http://www.yoursitename.com', 'http://localhost') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.yoursitename.com', 'http://localhost');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.yoursitename.com','http://localhost');

mysqldump工具来备份wordpress数据库

在操作前,无论使用插件还是sql语句,都要先备份数据库

1
sudo mysqldump -u root wordpress > wordpress.sql

备份wordpress根目录下的所有文件

1
sudo tar -cpvzf wordpress.tar.gz /home/wwwroot/wordpress/

上面的命令包含5个参数,分别为:

  • -c 创建一个归档文件;
  • -p 保留已归档文件的相应权限设置;
  • -v 显示详细信息;
  • -z 使用gzip压缩归档文件;
  • -f 代表文件。

执行上述命令后,/home/wwwroot/wordpress/文件夹下的所有文件都会被归档和压缩。

安装centos7时,有一个提示,是否加密磁盘,选择此选项后,每次启动系统都会要求你输入密码,这样可以保证磁盘如果没有密码,放到其它电脑上也无法使用。对数据会更加安全。

但每次手动输入密码还是比较麻烦,最好是把密钥放到U盘里,插上后就可以自动解锁,不需要输入人工输入密码。

我搜索了下,网上关于此的教程都无法完美解决,没有非常完善的文档,下面两个教程是最靠谱的,我也是根据这些教程,在虚拟机上测试成功后才找到具体的原因。

https://forums.centos.org/viewtopic.php?t=53452
https://community.spiceworks.com/how_to/168683-cenos-7-encrypt-my-data-and-use-usb-key-for-unlock

以下为完整的操作步骤:

创建一个带有keyfile的usb盘

使用fat格式即可,这样在windows电脑上也能使用

先通过lsblk blkid命令,查看系统上的硬盘情况。

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 11.9G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 10.7G 0 part
└─luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 253:0 0 10.7G 0 crypt
├─centos-root 253:1 0 9.5G 0 lvm /
└─centos-swap 253:2 0 1.2G 0 lvm [SWAP]
sdb 8:16 1 954M 0 disk
└─sdb1 8:17 1 954M 0 part /media
sr0 11:0 1 1024M 0 rom
1
2
3
4
5
6
7
8
[root@localhost ~]# blkid
/dev/sda1: SEC_TYPE="msdos" UUID="FC4C-1E93" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="dbf79d09-cbbf-4a09-8ac5-b997ae1c6dfd"
/dev/sda2: UUID="d4857a61-09d5-4768-b564-e3a12c2ca7d0" TYPE="xfs" PARTUUID="aa583022-7407-40dc-8f9e-1cb147dccd8b"
/dev/sda3: UUID="535d89c0-9b67-4138-a0f3-0879ef2a6cc6" TYPE="crypto_LUKS" PARTUUID="1e55ca3d-3636-4c37-8e27-d9bda13099a7"
/dev/sdb1: SEC_TYPE="msdos" LABEL="NEW" UUID="A06A-C2D3" TYPE="vfat"
/dev/mapper/luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6: UUID="nkQRNs-YN39-SR5g-Ge4r-jHNB-yfi4-PszeGt" TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="e5859343-e19d-4cf3-9ef9-c86664a8cae3" TYPE="xfs"
/dev/mapper/centos-swap: UUID="045010bd-a926-4202-9467-6e54d110688d" TYPE="swap"

上面/dev/sda3为加密的磁盘,/dev/sdb1为U盘(FAT文件系统)。记下他们的uuid,分别为
535d89c0-9b67-4138-a0f3-0879ef2a6cc6A06A-C2D3

先挂载U盘,并创建相应的文件

1
2
3
4
5
6
7
8
9
mount /dev/sdb1 /media 
mkdir /media/cryptboot
cd /media/cryptboot

#创建一个keyfile到u盘中
dd if=/dev/urandom bs=4096 count=1 of=/media/cryptboot/boot.key

#把boot.key添加为解锁的密钥,会弹出 Enter any existing passphrase: 让你输入密码
cryptsetup luksAddKey /dev/sda3 /media/cryptboot/boot.key

测试下添加的密钥文件有没有成功:

1
2
3
[root@localhost ~]# cryptsetup luksOpen -v --key-file /media/cryptboot/boot.key --test-passphrase /dev/sda3
Key slot 1 unlocked.
Command successful.

出现上面命令就是成功了。

修改启动方式

1
2
cp /etc/default/grub /etc/default/grub.original
sed -i 's|rd.lvm.lv=centos/swap|rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap|g' /etc/default/grub

即是在 /etc/default/grub 中GRUB_CMDLINE_LINUX这一行添加 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3

下面是修改后的

1
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.luks.uuid=luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap rhgb quiet"

修改下文件/etc/dracut.conf

1
2
echo 'add_drivers+="vfat nls_cp437 nls_iso8859-1 ext4"' >> /etc/dracut.conf
echo 'omit_dracutmodules+="systemd"' >> /etc/dracut.conf

重新生成grub 和 initramfs

1
2
3
4
5
grub2-mkconfig -o /boot/grub2/grub.cfg

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

dracut --force -v

之前一直不成功的原因是,我的电脑 是uefi启动方式+GPT磁盘,所以应该使用 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg。这点很重要。

之后重启电脑就可以了。

列出被删除的文件

1
lsof | grep deleted

第2列是进程id,第4列是文件描述符

查看删除文件

1
ls -l /proc/进程id/fd/文件描述符

恢复文件

1
cp /proc/进程id/fd/文件描述符 Newfilename

mysql数据库删除恢复

使用上面的命令恢复文件后,发现mysql数据库只恢复了.ibd文件,.frm文件无法使用lsof恢复

使用其它的表结构,复制到数据库目录,或者重新创建一个表drop table tbl_name

1
ALTER TABLE tbl_name DISCARD TABLESPACE;

这个命令会删除相应的ibd文件。

从备份文件中复制ibd文件到数据库目录,然后执行下面的命令。

1
ALTER TABLE tbl_name IMPORT TABLESPACE;

lnmp centos下mysql迁移数据目录到新硬盘

centos 硬盘分区

电脑中已经挂载了一个1T的新硬盘,最初安装centos系统时原先的nfts硬盘 sdb

lsblk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda 8:0 0 223.6G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 222.4G 0 part
└─luks-61af80c4-4d0a-4312-aae1-b66abd729eb5 253:0 0 222.4G 0 crypt
├─centos-root 253:1 0 185G 0 lvm /
├─centos-swap 253:2 0 7.8G 0 lvm [SWAP]
└─centos-home 253:3 0 29.6G 0 lvm /home
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 529M 0 part
├─sdb2 8:18 0 100M 0 part
├─sdb3 8:19 0 16M 0 part
├─sdb4 8:20 0 130.1G 0 part
├─sdb5 8:21 0 214.9G 0 part
├─sdb6 8:22 0 293G 0 part
└─sdb7 8:23 0 293G 0 part
sdc 8:32 1 14.6G 0 disk
└─sdc1 8:33 1 14.6G 0 part

fdisk -l

1
2
3
4
5
6
7
8
9
10
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x56c6d4e4

Device Boot Start End Blocks Id System
/dev/sdb1 1 4294967295 2147483647+ ee GPT
Partition 1 does not start on physical sector boundary.

创建分区

需要重新创建分区,把原先的分区重新分配

1
2
3
4
# parted /dev/sdb
(parted) mktable gpt
(parted) mkpart data 1024KiB -1
(parted print)

parted之后的参数是设备名。mkpart命令的三个参数分别是分区名(随便起),开始地址,结束地址-1表示至结尾,前面留出的空间可能是用于存放分区信息,不留的时候会有警告。print查看分区结果

格式化分区

mkfs.ext4 /dev/sdb1

mkfs.xfs /dev/sdb1

设置开机挂载

mkdir /data
mount /dev/sdb1 /data

修改/etc/fstab文件,在末尾加上一行:

/dev/sdb1 /data xfs defaults 0 0

迁移mysql数据库

先关闭mysql

/etc/init.d/mariadb stop

创建文件夹

mkdir /data/mysql/

复制datadir到新文件夹中

cp -a /usr/local/mariadb/var /data/mysql/

备份原数据目录

mv var var.bak

添加软链接

ln -s /data/mysql/var/ /usr/local/mariadb/

重启mysql即可

/etc/init.d/mariadb start

df -h 查看磁盘还有空间,但无法创建任何文件,提示磁盘空间已满(No space left on device)。

1
2
3
4
5
6
7
8
9
[root@centos-fra ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 17M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda1 80G 73G 7.1G 92% /
tmpfs 379M 0 379M 0% /run/user/0
/dev/sda 100G 26G 69G 28% /mnt/volume_fra1_01

最终发现下面的解决办法。

df -i 查看下索引节点(inode),会发现已经用满(IUsed=100%)。
这会导致无法创建文件和目录,并且提示 No space left on device

1
2
3
4
5
6
7
8
9
10
[root@centos-fra ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 479052 312 478740 1% /dev
tmpfs 485037 1 485036 1% /dev/shm
tmpfs 485037 464 484573 1% /run
tmpfs 485037 16 485021 1% /sys/fs/cgroup
/dev/vda1 22168424 6377093 15791331 29% /
tmpfs 485037 1 485036 1% /run/user/0
/dev/sda 3276800 3276800 0 100% /mnt/volume_fra1_01

原因

cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

linux里每个文件都有些元信息像创建时间,文件大小,文件名啊之类的,这些元信息就存在inode了。这样如果小文件过多的话,可能磁盘没满但inode空间已分配完,这时磁盘就跟满了一样无法写入.

解决办法

挂载之前 使用下面命令增大inode数量,如果已经挂载,需要先卸载。
但执行下面的命令后,磁盘相当于重新格式化,之前的数据就消失了。

1
mkfs.ext4 -N 20000000 /dev/path/to/volume

还有一个解决办法:

用软连接将空闲分区/home/wwwroot/中的newcache目录连接到/mnt/volume_fra1_01/.cache,使用/home分区的inode来缓解/mnt分区inode不足的问题:

参考文章

DigitalOcean浮动IP是可以分配给您的某个Droplet的可公开访问的静态IP地址.

由于工作需要,需要给VPS绑定一个新的IP,并且要求请求特定IP时,使用新IP的接口。

使用方法:

1
2
3
4
5
# 查看下你的浮云IP是设置成功
curl http://169.254.169.254/metadata/v1/floating_ip/ipv4/active

# 查看浮云IP对应的网关
curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/gateway

得到网关地址为 10.13.0.1

在路由中添加新路由

1
ip route add 10.0.1.3 via 10.13.0.1 dev eth0

这样访问10.0.1.3时,就会使用新ip的网关口请求了。

参考文章:

删除30天前的文件

你可以使用find命令搜索X天前的文件,前根据需要删除它

先列出 /home/wwwroot/db 下面30天前的文件

1
find /home/wwwroot/db -type f -mtime +30

检查列出的文件列表,如果没有问题,使用下面的命令删除它

1
find /opt/backup -type f -mtime +30 -exec rm -f {} \; 

根据文件后缀删除文件

你也可以增加过滤条件,只删除某一类型的文件。

比如删除.log后缀的30天前的日志文件

1
find /var/log -name "*.log" -type f -mtime +30 

同样,检查下列出的日志是否正确,然后再使用下面命令删除它

1
find /var/log -name "*.log" -type f -mtime +30 -exec rm -f {} \; 

这是一个MacOS的bug,发生的情况非常普遍。

一个可能的解决方案

kextstat | grep -v com.apple

1
2
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
116 0 0xffffff7f83ee4000 0x42000 0x42000 com.paragon-software.filesystems.ntfs (66.5.15) 43B8E60C-1D4C-37A1-A831-0ECF23B29456 <8 6 5 1>

卸载它

sudo kextunload -b com.paragon-software.filesystems.ntfs

1
2
kextstat | grep -v com.apple
Index Refs Address Size Wired Name (Version) UUID <Linked Against>

通过修改文件 /etc/resolv.conf 就可以修改dns

1
2
3
# Use Google's public DNS servers.
nameserver 8.8.4.4
nameserver 8.8.8.8

但是以上方法只是临时有效,服务器重启后就恢复原样了,还是变成下面这样

1
2
nameserver 127.0.0.53
search Home

怎么样才可以永久修改呢?

  1. 安装 resolvconf .

sudo apt install resolvconf

  1. 编辑 /etc/resolvconf/resolv.conf.d/head 添加以下内容:
1
2
3
4
# Make edits to /etc/resolvconf/resolv.conf.d/head.
nameserver 8.8.4.4
nameserver 8.8.8.8
Restart the resolvconf service.
  1. 重启服务

sudo service resolvconf restart

Ubuntu 18.04 下面 修改ip及dns使用netplan

显示ip信息

ip addr show

显示路由信息

ip route show

编辑网络信息

vi /etc/netplan/*.yaml

1
2
3
4
5
6
7
8
9
10
network:
ethernets:
eno1:
addresses: [192.168.1.13/24]
gateway4: 192.168.1.1
dhcp4: true
optional: true
nameservers:
addresses: [8.8.8.8,8.8.4.4]
version: 2

应用配置:

netplan apply

错误详情,lnmp下无法远程连接mysql

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.49' (60)

如果设置好mysql的远程连接后,仍然出现上面的问题一般是因为防火墙规则的问题。

查看iptables规则

sudo iptables -L

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- localhost anywhere tcp dpt:mysql
DROP tcp -- anywhere anywhere tcp dpt:mysql
ACCEPT tcp -- anywhere anywhere tcp dpt:mysql
ACCEPT tcp -- 192.168.1.0/24 anywhere tcp dpt:mysql

Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain DOCKER (1 references)
target prot opt source destination

注意上面多了一条

DROP tcp -- anywhere anywhere tcp dpt:mysql

mysql的远程连接被禁用了

使用下面命令显示规则的序号

sudo iptables -L -n --line-number

使用下面命令可以删除相应的规则

sudo optables -D INPUT 6

之后mysql连接就没问题了

下次重启规则还是会生效的,使用下面命令永久保存规则

sudo iptables-save

上面的保存还是不行,使用下面的命令永久保存。

如果没有安装iptables-persistent,先安装它

sudo apt-get install iptables-persistent

保存命令:

1
2
sudo netfilter-persistent save
sudo netfilter-persistent reload
0%