参考ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境搭建实验环境的时候,只能使用LimeSDR v17.06.0
的驱动,更新版本的的驱动,运行之后,手机设备不能正确的连接到建立的基站。
继续阅读解决ubuntu 16.04系统上2017.06版本之后的LimeSDR V1.4驱动不能正常运行OpenAirInterface搭建的LTE实验环境的问题
参考ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境搭建实验环境的时候,只能使用LimeSDR v17.06.0
的驱动,更新版本的的驱动,运行之后,手机设备不能正确的连接到建立的基站。
继续阅读解决ubuntu 16.04系统上2017.06版本之后的LimeSDR V1.4驱动不能正常运行OpenAirInterface搭建的LTE实验环境的问题
1) TM1,单天线端口传输:主要应用于单天线传输的场合。
2) TM2,发送分集模式:适合于小区边缘信道情况比较复杂,干扰较大的情况,有时候也用于高速的情况,分集能够提供分集增益。
3) TM3,开环空间分集:合适于终端(UE)高速移动的情况。
4) TM4,闭环空间分集:适合于信道条件较好的场合,用于提供高的数据率传输。
5) TM5,MU-MIMO传输模式:主要用来提高小区的容量。
6) TM6,Rank1的传输:主要适合于小区边缘的情况。
7) TM7,Port5的单流Beamforming模式:主要也是小区边缘,能够有效对抗干扰。
8) TM8,双流Beamforming模式:可以用于小区边缘也可以应用于其他场景。
9) TM9,传输模式9是LTE-A中新增加的一种模式,可以支持最大到8层的传输,主要为了提升数据传输速率。
TDD 配比2下的TM9,在0 1 5 6子帧调度最大是88RB,3 4 8 9子帧调度最大100RB。
开环”,即发射端无法获得信道信息的条件下使用
空间复用是为了提高传输数据数量; 传输分级是为了提高传输数据质量;
TM3与TM4的区别:
对于TM3,预编码不依赖于UE上报的建议使用的预编码矩阵(即UE不上报PMI),eNodeB和UE使用相同的方式从一个预先定义的集合中选择一个预编码矩阵。
注:
1、《技术规范》P.38页中的“发送分集”,即是《系统设计》P.158中的“传输分集”,二者是一个意思。
2、传输模式即是《技术规范》P.38页中的“MIMO模式”。
最近收到招商银行香港银行的短信:
1 |
尊敬的客户,您的香港一卡通已超过18个月无主动交易,请于xx年xx月xx日前办理一笔交易以保持账户活动。 |
查询了一下,根据香港的规定,"账户连续两年内没有任何主动交易,则账户自动转为冻结状态,成为“睡眠户”,该类账户不允许进行出款交易。若您需要重新恢复该账户的使用,需要您填妥解除睡眠户表格寄送给香港分行审批,审批通过后,香港分行会主动联系您,核实后可以解除。"
以前总是傻傻的进行一次国内的转账操作,每次都被收高昂的手续费。今天终于想明白了,只要进行交易都算,那么干脆做一笔最小的活期转定期的存款,比如100
块美金的一周定期,就搞定了。
最近(2021/03),上述的办法已经不行了,最近会收到如下信息:
1 |
您的相关一卡通长期未有网银转账,请您于xx月xx日前通过香港专业版完成一笔转出交易,避免限额清零,详情可咨询95555 |
比较简单的方式是找同事要一下账号,同行转出1分钱即可,也可以给慈善机构捐款,还是转账一分钱最简单。
另外,若网银每日限额已经被清零,可能收到如下短信通知:
1 |
您的香港一卡通长期未有网银转账,现香港专业版限额已被清零,您可于一个月内通过香港专业版-其他功能-限额管理复原,详情可咨询95555 |
可以登录香港专业版,可以使用“复原网银限额”复原到最近一次的网银限额;只有一个月内复原,才有效果。
微软曾经为macOS
提供过Windows
远程桌面,但是已经非常长时间没有更新过了,导致在macOS High Sierra
系统上的远程桌面是无法连接Windows 10
的。
其实微软还是为最新的macOS High Sierra
提供了远程桌面程序的,在苹果应用商店的应用名为Microsoft Remote Desktop Beta
,但是遗憾的是,设置了只能美国的用户才能下载。因此我们需要手工下载,然后安装。
可以在本站下载一份目前的最新拷贝。
这是最好的时代,也是最坏的时代。
生活在科技大爆发的时代里,你是否感觉到一丝庆幸? 虚拟现实、自动驾驶,无数令人血脉偾张的新型应用正在井喷式地爆发,模糊了虚拟和现实的边界,并深刻地改变着我们触碰和认知世界的方式。
而这,对于通信人而言却是一场艰苦卓绝的战斗。
继续阅读5G通信技术解读|大规模天线阵列技术
在之前的文章(《如何实现比4G快十倍?毫米波技术是5G的关键》)中我们介绍了如何利用毫米波技术获得更多的频谱资源,接下来的问题是如何充分利用这些频谱资源——如何让多个用户通讯但又互不干扰,专业术语叫做频谱复用。
最近公司的一台使用华硕B150M-ET/V5
主板的机器,在插拔USB
设备的时候,一定概率会出现总线故障,导致全部的USB
设备丢失,此时跟内核死机没有太大的区别,全部的鼠标键盘都不能使用了。通过SSH
远程登录上去,可以看到如下日志:
1 2 3 4 5 6 |
$ dmsg .......... [193406.749081] xhci_hcd 0000:00:14.0: xHCI host not responding to stop endpoint command. [193406.749098] xhci_hcd 0000:00:14.0: xHCI host controller not responding, assume dead [193406.749120] xhci_hcd 0000:00:14.0: HC died; cleaning up .......... |
这个问题初步判断是主板BIOS
的BUG
,解决方法就是升级BIOS
。
目前最新的BIOS
为B150M-ET-ASUS-3606
日期为02/21/2018
发布的版本。
目前官方网站上的页面中没有这个固件的链接地址,用BIOS
自带的在线升级工具可以升级到这个版本。
官方版本的下载地址为:
https://dlsvr04.asus.com/pub/ASUS/mb/LGA1151/B150M-ET/B150M-ET-ASUS-3606.zip
如果官方下载存在问题,可以在本站下载一份拷贝:
B150M-ET-ASUS-3606
使用gnuradio
播放自己的音乐,安装必要的软件
1 2 3 4 5 |
$ sudo apt-get install hackrf $ sudo apt-get install gr-osmosdr $ sudo apt-get install gnuradio |
点击展开代码,保存为wbfm_tx_hackrf.grc
,然后双击打开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#安装预编译版本,为后续编译减少依赖,预编译版本太老了 $ sudo apt-get install libarmadillo-dev $ cd ~ #编译安装最新版本的armadillo,gr-doa需要这个库的支持 $ git clone https://github.com/conradsnicta/armadillo-code.git $ cd armadillo-code $ mkdir build $ cd build $ cmake .. $ make $ sudo make install #编译安装SoapySDR,为我们后续操作LimeSDR准备操作接口 $ cd ~ $ git clone https://github.com/pothosware/SoapySDR.git $ cd SoapySDR $ git pull origin master $ mkdir build && cd build $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig #编译安装GrOsmoSDR,后续为了支持GnuRadio,我们需要GrOsmoSDR帮我们完成一个中转 $ cd ~ $ git clone git://git.osmocom.org/gr-osmosdr $ cd gr-osmosdr #修正几处问题 $ sed -i '$a\from _osmosdr_swig import source_IQBalanceOff' ./python/__init__.py $ sed -i '$a\from _osmosdr_swig import source_IQBalanceManual' ./python/__init__.py $ sed -i '$a\from _osmosdr_swig import source_IQBalanceAutomatic' ./python/__init__.py $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig #编译安装LimeSDR的驱动 $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite #建议2018年4月以后的的主分支,早期版本存在相位随时间漂移的问题 $ git checkout master # 不可删除build目录,清理build目录后要还原被误删除的文件, # 原因在于build目录下存在mcu程序,默认应用启动后从这个目录提取mcu程序刷新到设备 $ mkdir build ; cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig $ cd ../udev-rules/ $ sudo ./install.sh # Download board firmware $ sudo LimeUtil --update |
gr-doa
源代码
1 2 3 4 |
#编译安装gr-doa $ cd ~ $ git clone https://github.com/EttusResearch/gr-doa.git |
增加limesdr
的调用代码:
1 2 3 4 5 |
$ sed -i "s/__init__.py/__init__.py\nlimesdr_soapysdr_source.py/g" ~/gr-doa/python/CMakeLists.txt $ sed -i "s/from twinrx_usrp_source import twinrx_usrp_source/from twinrx_usrp_source import twinrx_usrp_source\nfrom limesdr_soapysdr_source import limesdr_soapysdr_source/g" ~/gr-doa/python/__init__.py $ vim ~/gr-doa/python/limesdr_soapysdr_source.py |
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# -*- coding: utf-8 -*- # # Copyright 2018 # longsky <wangqiang1588@sina.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # from gnuradio import gr from gnuradio import blocks import SoapySDR from SoapySDR import * #SOAPY_SDR_ constants import osmosdr from osmosdr import * from gnuradio.filter import firdes def gen_sig_io(num_elements): # Dynamically create types for signature io = [] for i in range(num_elements): io.append(gr.sizeof_gr_complex*1) io.append(gr.sizeof_float*num_elements) return io class limesdr_soapysdr_source(gr.hier_block2): def __init__(self, samp_rate=1000000, center_freq=2400000000, gain=40, sources=2): gr.hier_block2.__init__( self, "LimeSDR SoapySDR", gr.io_signature(0, 0, 0), gr.io_signaturev(sources, sources, gen_sig_io(sources)), ) ################################################## # Parameters ################################################## self.samp_rate = samp_rate self.center_freq = center_freq self.gain = gain self.sources = sources args = dict(driver="lime") limesdr = SoapySDR.Device(args) # We need to detect the number of channels as the LimeSDR has two # and the LimeSDR-Mini has one chans = range(limesdr.getNumChannels(0)) if len(chans) < sources : raise Exception("limesdr device doesn't provide enough rx channels ") while len(chans) > sources : chans.pop() limesdr = None #warnning: args must be written like below args = 'soapy=0,driver=lime,nchan=' + str(sources) self.osmosdr_source_0 = osmosdr.source(args) self.osmosdr_source_0.set_clock_source('internal', 0) self.osmosdr_source_0.set_sample_rate(self.samp_rate) #self.osmosdr_source_0.set_time_now(osmosdr.time_spec_t()) for ch in chans: self.osmosdr_source_0.set_gain(self.gain, ch) # print(self.limesdr.listAntennas(SOAPY_SDR_RX, 0)) # ('NONE', 'LNAH', 'LNAL', 'LNAW', 'LB1', 'LB2') #RX_L : is lower then 2.5Ghz,RX_H : higher than 2.5GhZ self.osmosdr_source_0.set_antenna("LNAH", ch) #self.osmosdr_source_0.set_bandwidth(ch,20*1000*1000) self.osmosdr_source_0.set_dc_offset_mode(osmosdr.source_IQBalanceAutomatic,ch) # Use timed commands to set frequencies self.set_center_freq(center_freq,sources) ################################################## # Connections ################################################## for source in range(sources): self.connect((self.osmosdr_source_0, source), (self, source)) def __del__(self): self.disconnect_all() if hasattr(gr.hier_block2,"__del__") : gr.hier_block2.__del__(self) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self.osmosdr_source_0.set_sample_rate(self.samp_rate) def set_center_freq(self, center_freq, sources): self.center_freq = center_freq for ch in range(self.sources): self.osmosdr_source_0.set_center_freq(self.center_freq, ch) def get_center_freq(self): return self.center_freq def get_gain(self): return self.gain def set_gain(self, gain): print "DO NOT TUNE GAINS DURING RUNTIME" def get_sources(self): return self.sources def set_sources(self, sources): print "DO NOT CHANGE SOURCES DURING RUNTIME" |
编译代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cd ~ $ cd gr-doa $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig |
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Run Rootmusic Lin Array LimeSDR # Generated: Tue Apr 3 20:14:45 2018 ################################################## if __name__ == '__main__': import ctypes import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print "Warning: failed to XInitThreads()" def struct(data): return type('Struct', (object,), data)() from PyQt4 import Qt from gnuradio import eng_notation from gnuradio import gr from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from optparse import OptionParser import doa import sys class run_RootMUSIC_lin_array_LimeSDR(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Run Rootmusic Lin Array LimeSDR") Qt.QWidget.__init__(self) self.setWindowTitle("Run Rootmusic Lin Array LimeSDR") try: self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: pass self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) self.top_scroll_layout.addWidget(self.top_scroll) self.top_scroll.setWidgetResizable(True) self.top_widget = Qt.QWidget() self.top_scroll.setWidget(self.top_widget) self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) self.settings = Qt.QSettings("GNU Radio", "run_RootMUSIC_lin_array_LimeSDR") self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Variables # NormSpacing 天线之间的实际距离,单位为米,类型为浮点类型 # NumTargets 发出信号的设备数量 ################################################## self.input_variables = input_variables = struct({"SampleRate": 1000000, "CenterFreq": 2550000000, "Gain": 60, "NumArrayElements": 2, "NormSpacing": 0.5, "SnapshotSize": 2**11, "OverlapSize": 2**9, "NumTargets": 1, }) ################################################## # Blocks ################################################## self.limesdr = doa.limesdr_soapysdr_source( samp_rate=input_variables.SampleRate, center_freq=input_variables.CenterFreq, gain=input_variables.Gain, sources=input_variables.NumArrayElements ) self.tab = Qt.QTabWidget() self.tab_widget_0 = Qt.QWidget() self.tab_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.tab_widget_0) self.tab_grid_layout_0 = Qt.QGridLayout() self.tab_layout_0.addLayout(self.tab_grid_layout_0) self.tab.addTab(self.tab_widget_0, "Angle of Arrival") self.top_layout.addWidget(self.tab) self.doa_rootMUSIC_linear_array_0 = doa.rootMUSIC_linear_array(input_variables.NormSpacing, input_variables.NumTargets, input_variables.NumArrayElements) self.doa_qt_compass_0 = doa.compass("", 0, 180, 10, 0) self.top_layout.addLayout(self.doa_qt_compass_0.this_layout) self.doa_autocorrelate_0 = doa.autocorrelate(input_variables.NumArrayElements, input_variables.SnapshotSize, input_variables.OverlapSize, 1) ################################################## # Connections ################################################## self.connect((self.doa_autocorrelate_0, 0), (self.doa_rootMUSIC_linear_array_0, 0)) self.connect((self.doa_rootMUSIC_linear_array_0, 0), (self.doa_qt_compass_0, 0)) for ch in range(input_variables.NumArrayElements) : self.connect((self.limesdr, ch), (self.doa_autocorrelate_0, ch)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "run_RootMUSIC_lin_array_LimeSDR") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def main(top_block_cls=run_RootMUSIC_lin_array_LimeSDR, options=None): from distutils.version import StrictVersion if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): style = gr.prefs().get_string('qtgui', 'style', 'raster') Qt.QApplication.setGraphicsSystem(style) qapp = Qt.QApplication(sys.argv) tb = top_block_cls() tb.start() tb.show() def quitting(): tb.stop() tb.wait() qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) qapp.exec_() if __name__ == '__main__': main() |
如果上面的代码下载困难,可从本站下载一份代码拷贝
gr-doa,armadillo-code,SoapySDR源代码下载,gr-osmosdr
至于测试的信号发送设备,任何能产生自相关信号的设备都可以,一般建议对讲机即可,注意频率要调整到一致才可以。
首先参考 ubuntu 16.04配置MySQL主从同步 实现同步,接下来执行如下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#生成加密证书,默认在/var/lib/mysql/下生成ca-key.pem,server-key.pem,client-key.pem $ sudo mysql_ssl_rsa_setup --uid=mysql #有时候需要手工修改一下证书所有者 $ sudo chown mysql:mysql /var/lib/mysql/*.pem $ sudo ls -l /var/lib/mysql/ | grep .pem -rw------- 1 mysql mysql 1679 Apr 2 22:53 ca-key.pem #CA私钥 -rw-r--r-- 1 mysql mysql 1107 Apr 2 22:53 ca.pem #自签的CA证书,客户端连接也需要提供 -rw-r--r-- 1 mysql mysql 1107 Apr 2 22:53 client-cert.pem #客户端连接服务器端需要提供的证书文件 -rw------- 1 mysql mysql 1679 Apr 2 22:53 client-key.pem #客户端连接服务器端需要提供的私钥文件 -rw------- 1 mysql mysql 1675 Apr 2 22:53 private_key.pem #私钥/公钥对的私有成员 -rw-r--r-- 1 mysql mysql 451 Apr 2 22:53 public_key.pem #私钥/公钥对的共有成员 -rw-r--r-- 1 mysql mysql 1107 Apr 2 22:53 server-cert.pem #服务器端证书文件 -rw------- 1 mysql mysql 1679 Apr 2 22:53 server-key.pem #服务器端私钥文件 #配置服务器 $ sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak $ sudo sed -i "s/# ssl-ca=\/etc\/mysql\/cacert.pem/ssl-ca=\/var\/lib\/mysql\/ca.pem/g" /etc/mysql/mysql.conf.d/mysqld.cnf $ sudo sed -i "s/# ssl-cert=\/etc\/mysql\/server-cert.pem/ssl-cert=\/var\/lib\/mysql\/server-cert.pem/g" /etc/mysql/mysql.conf.d/mysqld.cnf $ sudo sed -i "s/# ssl-key=\/etc\/mysql\/server-key.pem/ssl-key=\/var\/lib\/mysql\/server-key.pem/g" /etc/mysql/mysql.conf.d/mysqld.cnf #重启MySQL服务 $ sudo service mysql restart #查看服务器状态,是否已经启用SSL $ mysql -u root -p -e "show global variables like '%ssl%'" Enter password: +---------------+--------------------------------+ | Variable_name | Value | +---------------+--------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /var/lib/mysql/ca.pem | | ssl_capath | | | ssl_cert | /var/lib/mysql/server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /var/lib/mysql/server-key.pem | +---------------+--------------------------------+ #修改已存在用户,要求必须通过SSL才能同步,完成主从同步之后,从库可能会无法正常同步这个修改,需要手工跳过一个错误 "stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;start slave;" $ mysql -u root -p -e "ALTER USER 'repl'@'182.254.149.39' REQUIRE SSL;" # 阻止数据库记录写入,避免后期我们备份数据库的时候数据发生变动 # 该命令对于普通账号的只读模式,root 账号无效,因此访问数据库的账号 # 尽量不要使用root账号,如果是root 账号,只能暂时停止所有访问数据库的服务了 $ mysql -u root -p -e "set global read_only=1;" #查询并记录主库的同步位置 $ mysql -u root -p -e "SHOW MASTER STATUS;" Enter password: +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000021 | 12144639 | | | | +------------------+----------+--------------+------------------+-------------------+ # 执行 ubuntu 16.04配置MySQL主从同步 http://www.mobibrw.com/?p=10541 里的备份脚本 $ sudo bash backup_wordpress.sh # 取消普通账号的只读模式 $ mysql -u root -p -e "set global read_only=0;" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
$ sudo mkdir /etc/mysql/ssl #从服务端获取证书 $ sudo scp -P 22 -r root@www.mobibrw.com:/var/lib/mysql/ca.pem /etc/mysql/ssl/ $ sudo chown mysql:mysql /etc/mysql/ssl/ca.pem $ sudo scp -P 22 -r root@www.mobibrw.com:/var/lib/mysql/client-cert.pem /etc/mysql/ssl/ $ sudo chown mysql:mysql /etc/mysql/ssl/client-cert.pem $ sudo scp -P 22 -r root@www.mobibrw.com:/var/lib/mysql/client-key.pem /etc/mysql/ssl/ $ sudo chown mysql:mysql /etc/mysql/ssl/client-key.pem $ mysql -u root -p -e "stop slave;" #获取最后同步的位置,为后续恢复进行准备 $ mysql -u root -p -e "show slave status\G;" | grep Exec_Master_Log_Pos: Enter password: Exec_Master_Log_Pos: 12178842 $ mysql -u root -p -e "show slave status\G;" | grep Master_Log_File Enter password: Master_Log_File: mysql-bin.000021 Relay_Master_Log_File: mysql-bin.000021 #修改同步信息 $ mysql -u root -p -e "CHANGE MASTER TO MASTER_HOST='www.mobibrw.com', MASTER_USER='repl', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='mysql-bin.000021',MASTER_LOG_POS=12178842 ,master_ssl=1,master_ssl_ca='/etc/mysql/ssl/ca.pem', master_ssl_capath='/etc/mysql/ssl', master_ssl_cert='/etc/mysql/ssl/client-cert.pem', master_ssl_key='/etc/mysql/ssl/client-key.pem';" $ mysql -u root -p -e "start slave;" #查看从库状态 $ mysql -u root -p -e "show slave status\G;" Enter password: *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: www.mobibrw.com Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000021 Read_Master_Log_Pos: 12701244 Relay_Log_File: VM-xxx-xxx-xxxxx-relay-bin.000003 Relay_Log_Pos: 195033 Relay_Master_Log_File: mysql-bin.000021 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 12701244 Relay_Log_Space: 523107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File: /etc/mysql/ssl/ca.pem Master_SSL_CA_Path: /etc/mysql/ssl Master_SSL_Cert: /etc/mysql/ssl/client-cert.pem Master_SSL_Cipher: Master_SSL_Key: /etc/mysql/ssl/client-key.pem Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: |
注意,偶尔在系统升级的时候,从库可能会丢失同步状态配置。这时候,我们需要重新同步,此时我们从从设备/var/lib/mysql/master.info
中找到被中断的同步点。
里面的内容一般如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
25 mysql-bin.000582 4765083 www.mobibrw.com xxxx xxxx 3306 60 1 /etc/mysql/ssl/ca.pem /etc/mysql/ssl /etc/mysql/ssl/client-cert.pem /etc/mysql/ssl/client-key.pem 0 30.000 0 0b674082-f01d-11e9-8f8c-00163e0a4ffe 86400 0 |
注意mysql-bin.000582
下面的4765083
就是同步位置,在恢复的时候,就是这两个关键数据。