2014-04-21 1 views
0

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 열이 NULL

SELECT 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 | 
+--------------------------------------+--------------------------------+---------+ 
+0

나는 (그것이 선호하는 구문이 아니더라도) 첫 번째가 작동해야한다고 생각한다. 샘플 데이터로 sqlfiddle을 만들 수 있습니까? – Barmar

+0

첫 번째 버전에서는'a.port_id = b.id'가되어야합니까? – flaschenpost

+0

예 첫 번째 쿼리는 a.port_id = b.id와 함께 작동합니다. 나는 device_id를 사용하고 있었지만 SQL이 잘못되었다는 것을 알기 때문에 내 실수를 발견하지 못했습니다. 시간 낭비해서 미안해. 이것에 대해 선호되는 구문은 무엇일까? – Brent

답변

0

브렌트,

: nova.instances의 UUID에 매핑

우리가이 질문에 답하는 데 문제가되는 것은 nova.instances의 데이터가 중성자 데이터 포트와 일치하는지 이해할 수 없다는 것입니다. 귀하의 시도에서 nova.instances.uuidneutron.ports.device_id과 일치 할 것으로 예상되는 것으로 보입니다. 이 경우 첫 번째 쿼리가 작동해야합니다.

몇 가지 샘플 데이터와 예상 출력을 제공 할 수 있습니까? 나는 그것이 우리의 혼란을 해결할 수 있다고 생각합니다. 선호하는 구문의 질문에 대해


편집

, 내가 Barmar가 직교에 굽실 거리는 것으로 의심하는 것은 where 절에 의해 제한 조인.대신에 아래의 쿼리를 고려해

SELECT ip.ip_address 
    ,i.hostname 
FROM neutron.ipallocations ip 
JOIN neutron.ports p ON ip.port_id = p.id 
JOIN nova.instances i ON p.device_id = i.uuid 
WHERE i.deleted = '0'; 

분명히하기 위해, 옵티마이 저는 두 쿼리에 대해 동일한 실행 경로를 선택하지만 on 절을 사용하는 쿼리가 더 읽기하게한다. 나는 또한 별칭을 바꿨다. 개인적으로 나는 별칭을 의미있는 이름으로 선호합니다.

+0

필자는 몇 가지 샘플 데이터를 추가했습니다. 현재 솔루션 노트를 언급 한 flaschenpost에서 ports 테이블에 device_id와 id를 섞어 놓았습니다. – Brent

관련 문제