openstack MySQL 데이터베이스에서 정보를 얻고 싶습니다. 그러나 쿼리 기술이 제한되어 있고 두 개의 다른 데이터베이스에서 세 테이블에 대한 조인이 필요하다고 생각합니다. 다음과 같이MySQL 및 Openstack 일부 쿼리 조언이 필요합니다.
테이블의 구조는 다음과 같습니다 노바 테이블 스키마로
mysql> describe neutron.ipallocations;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| port_id | varchar(36) | YES | MUL | NULL | |
| ip_address | varchar(64) | NO | PRI | NULL | |
| subnet_id | varchar(36) | NO | PRI | NULL | |
| network_id | varchar(36) | NO | PRI | NULL | |
+------------+-------------+------+-----+---------+-------+
mysql> describe neutron.ports;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| tenant_id | varchar(255) | YES | | NULL | |
| id | varchar(36) | NO | PRI | NULL | |
| name | varchar(255) | YES | | NULL | |
| network_id | varchar(36) | NO | MUL | NULL | |
| mac_address | varchar(32) | NO | | NULL | |
| admin_state_up | tinyint(1) | NO | | NULL | |
| status | varchar(16) | NO | | NULL | |
| device_id | varchar(255) | NO | | NULL | |
| device_owner | varchar(255) | NO | | NULL | |
+----------------+--------------+------+-----+---------+-------+
mysql> describe nova.instances;
+----------------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+-----------------------+------+-----+---------+----------------+
| uuid | varchar(36) | YES | UNI | NULL | |
| hostname | varchar(255) | YES | | NULL | |
| deleted | int(11) | YES | | NULL | |
+----------------------+-----------------------+------+-----+---------+----------------+
난 그냥 내가 필요로하는 필드를 포함 할를 절단 한 매우 크다.
내가하고 싶은 것은 모든 인스턴스 호스트 이름 (nova.instance 테이블)을 ip_address (중성자 할당 테이블)와 연결하는 것입니다. 인스턴스가 삭제됨 필드에 0이 있어야 라이브임을 나타낼 수 있습니다.
그러나 둘 사이에는 직접 매핑이 없습니다. 링크 테이블은 neutron.ports입니다. neutron.ports에서 는 DEVICE_ID는 인스턴스 UUID 하나 개의 관계에 대한 하나이며 또한 neutron.ipaccolcation는
그래서 나는 다음과 같은 시도 포트 ID :
SELECT a.ip_address,c.hostname
FROM neutron.ipallocations a, neutron.ports b,nova.instances c
WHERE c.deleted='0'
AND b.device_id = c.uuid
AND a.port_id = b.device_id;
이 뭔가 그래서 어떤 결과를 반환하지 않습니다 아마 그걸로 아주 틀렸다.
또한 LEFT를 사용하려하고 INNER이 쿼리는 호스트 이름을 반환하지만 내가 뭔가를 놓친 것 같아 있도록 IP_ADDRESS 열이 NULLSELECT ni.hostname, i.ip_address
FROM nova.instances ni
LEFT JOIN neutron.ports p
INNER JOIN neutron.ipallocations i
ON i.port_id = p.device_id
ON ni.uuid = p.device_id WHERE ni.deleted ='0';
결합합니다.
이 경우 조인을 사용해야하는지 또는 더 간단한 방법으로 수행 할 수 있는지 알 수 없습니다. 만약에 어떤 포인터 나 해결책이 있다면 나는 매우 감사 할 것입니다.
select * from neutron.ipallocations;
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
| port_id | ip_address | subnet_id | network_id |
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
| 13433d6d-bf47-476b-a841-324aba4a902d | 192.168.14.5 | b024436e-7c69-42ff-b504-219ce9979792 | 96a8fd64-8a94-476d-b9c8-c28055d39041 |
| 5b66e69f-829d-419e-8116-889e0ad36c35 | 192.168.14.7 | b024436e-7c69-42ff-b504-219ce9979792 | 96a8fd64-8a94-476d-b9c8-c28055d39041 |
| 8e32216f-11db-437f-981d-cfe03e90baed | 192.168.14.4 | 07e516af-1162-4bfc-946b-fdc259b013c9 | bdfdb6d6-c0bc-4bdb-896e-6e5919d232c2 |
| 92a45ed8-a472-4845-841f-604259c07ab2 | 192.168.14.6 | b024436e-7c69-42ff-b504-219ce9979792 | 96a8fd64-8a94-476d-b9c8-c28055d39041 |
+--------------------------------------+--------------+--------------------------------------+--------------------------------------+
neutron.ports의 id 필드이 테이블 맵에서 포트 ID :
select * from neutron.ports;
+----------------------------------+--------------------------------------+------+--------------------------------------+-------------------+----------------+--------+-------------------------------------------------------------------------------+--------------+
| tenant_id | id | name | network_id | mac_address | admin_state_up | status | device_id | device_owner |
+----------------------------------+--------------------------------------+------+--------------------------------------+-------------------+----------------+--------+-------------------------------------------------------------------------------+--------------+
| 9a111d6e4dd0440fab4cc7b610efd2bf | 13433d6d-bf47-476b-a841-324aba4a902d | | 96a8fd64-8a94-476d-b9c8-c28055d39041 | fa:16:3e:6b:ed:5d | 1 | ACTIVE | dhcpc7e0c2c5-8a56-5b48-a120-03c05bff04a5-96a8fd64-8a94-476d-b9c8-c28055d39041 | network:dhcp |
| 9a111d6e4dd0440fab4cc7b610efd2bf | 5b66e69f-829d-419e-8116-889e0ad36c35 | | 96a8fd64-8a94-476d-b9c8-c28055d39041 | fa:16:3e:b9:4d:2e | 1 | ACTIVE | 578485e5-9f5f-405c-a09a-24f89b81a43c | compute:nova |
| 9a111d6e4dd0440fab4cc7b610efd2bf | 8e32216f-11db-437f-981d-cfe03e90baed | | bdfdb6d6-c0bc-4bdb-896e-6e5919d232c2 | fa:16:3e:55:af:d5 | 1 | ACTIVE | dhcpc7e0c2c5-8a56-5b48-a120-03c05bff04a5-bdfdb6d6-c0bc-4bdb-896e-6e5919d232c2 | network:dhcp |
| 9a111d6e4dd0440fab4cc7b610efd2bf | 92a45ed8-a472-4845-841f-604259c07ab2 | | 96a8fd64-8a94-476d-b9c8-c28055d39041 | fa:16:3e:06:ad:13 | 1 | ACTIVE | 221a44fe-23e6-4003-8170-dafedeeaf333 | compute:nova |
+----------------------------------+--------------------------------------+------+--------------------------------------+-------------------+----------------+--------+-------------------------------------------------------------------------------+--------------+
및 neutron.ports에서 DEVICE_ID 아래의 혼란을 드려 죄송합니다
몇 가지 샘플 데이터입니다
mysql> select uuid,hostname,deleted from nova.instances where deleted ='0';
+--------------------------------------+--------------------------------+---------+
| uuid | hostname | deleted |
+--------------------------------------+--------------------------------+---------+
| 221a44fe-23e6-4003-8170-dafedeeaf333 | host1.test.net | 0 |
| 578485e5-9f5f-405c-a09a-24f89b81a43c | host2.test.net | 0 |
+--------------------------------------+--------------------------------+---------+
나는 (그것이 선호하는 구문이 아니더라도) 첫 번째가 작동해야한다고 생각한다. 샘플 데이터로 sqlfiddle을 만들 수 있습니까? – Barmar
첫 번째 버전에서는'a.port_id = b.id'가되어야합니까? – flaschenpost
예 첫 번째 쿼리는 a.port_id = b.id와 함께 작동합니다. 나는 device_id를 사용하고 있었지만 SQL이 잘못되었다는 것을 알기 때문에 내 실수를 발견하지 못했습니다. 시간 낭비해서 미안해. 이것에 대해 선호되는 구문은 무엇일까? – Brent